Skip to content

Commit 707e5cf

Browse files
authored
fix: add service labels for hostname (#35)
Add service label `exported_service` and update dashboards accordingly. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added support for specifying a global service name label for all exported metrics, configurable via a new flag or environment variable. * All metrics now include a consistent service label for improved filtering and identification. * **Improvements** * Updated Grafana dashboards and Prometheus configuration to use the new service label for queries and grouping. * Metrics server logs now display the service name for easier monitoring. * **Bug Fixes** * Ensured all metrics consistently include the service label when metrics are enabled. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 8382d63 commit 707e5cf

File tree

6 files changed

+138
-60
lines changed

6 files changed

+138
-60
lines changed

cmd/main.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func NewRootCmd(v *viper.Viper) *cobra.Command {
114114
rootCmd.PersistentFlags().Bool("metrics.enabled", true, "Enable metrics server")
115115
rootCmd.PersistentFlags().String("metrics.listen", ":4000", "Address to listen on for metrics")
116116
rootCmd.PersistentFlags().String("metrics.path", "/metrics", "Path to expose metrics on")
117+
rootCmd.PersistentFlags().String("metrics.service-name", "", "Service name for metrics labeling (defaults to HOSTNAME env var)")
117118

118119
// Configuration file support
119120
rootCmd.PersistentFlags().StringP("config", "c", "", "config file (default is $HOME/.akash-proxy/config.yaml)")
@@ -126,9 +127,18 @@ func runProxy(cfg config.Config) {
126127

127128
var metricsServer *http.Server
128129
if cfg.Metrics.Enabled {
130+
// Determine service name from flag or HOSTNAME environment variable
131+
serviceName := cfg.Metrics.ServiceName
132+
if serviceName == "" {
133+
serviceName = os.Getenv("HOSTNAME")
134+
}
135+
136+
// Set service name for all metrics
137+
metrics.SetServiceName(serviceName)
138+
129139
metricsServer = metrics.PrepareMetricsServer(cfg.Metrics.Listen, cfg.Metrics.Path)
130140
go func() {
131-
log.Info("metrics server", "addr", metricsServer.Addr, "path", cfg.Metrics.Path)
141+
log.Info("metrics server", "addr", metricsServer.Addr, "path", cfg.Metrics.Path, "service", serviceName)
132142
if err := metricsServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
133143
panic(err)
134144
}

deploy/grafana/provisioning/dashboards/node-drilldown.json

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
},
9393
"disableTextWrap": false,
9494
"editorMode": "builder",
95-
"expr": "proxy_node_health{type=\"$proxy_type\", node=\"$node\", job=\"$service\"}",
95+
"expr": "proxy_node_health{type=\"$proxy_type\", node=\"$node\", exported_service=\"$service\"}",
9696
"fullMetaSearch": false,
9797
"includeNullMetadata": true,
9898
"legendFormat": "__auto",
@@ -162,7 +162,7 @@
162162
},
163163
"disableTextWrap": false,
164164
"editorMode": "builder",
165-
"expr": "proxy_request_status_count{type=\"$proxy_type\", node=\"$node\", job=\"$service\"}",
165+
"expr": "proxy_request_status_count{type=\"$proxy_type\", node=\"$node\", exported_service=\"$service\"}",
166166
"fullMetaSearch": false,
167167
"includeNullMetadata": true,
168168
"legendFormat": "{{status_code}}",
@@ -230,7 +230,7 @@
230230
},
231231
"disableTextWrap": false,
232232
"editorMode": "builder",
233-
"expr": "proxy_request_count{type=\"$proxy_type\", node=\"$node\", job=\"$service\"}",
233+
"expr": "proxy_request_count{type=\"$proxy_type\", node=\"$node\", exported_service=\"$service\"}",
234234
"fullMetaSearch": false,
235235
"includeNullMetadata": true,
236236
"legendFormat": "__auto",
@@ -330,7 +330,7 @@
330330
},
331331
"disableTextWrap": false,
332332
"editorMode": "builder",
333-
"expr": "rate(proxy_request_status_count{type=\"$proxy_type\", node=\"$node\", job=\"$service\"}[$__rate_interval])",
333+
"expr": "rate(proxy_request_status_count{type=\"$proxy_type\", node=\"$node\", exported_service=\"$service\"}[$__rate_interval])",
334334
"fullMetaSearch": false,
335335
"includeNullMetadata": false,
336336
"legendFormat": "{{status_code}}",
@@ -358,10 +358,6 @@
358358
"steps": [
359359
{
360360
"color": "green"
361-
},
362-
{
363-
"color": "red",
364-
"value": 80
365361
}
366362
]
367363
}
@@ -401,7 +397,7 @@
401397
},
402398
"disableTextWrap": false,
403399
"editorMode": "builder",
404-
"expr": "proxy_request_status_count{type=\"$proxy_type\", node=\"$node\", job=\"$service\"}",
400+
"expr": "proxy_request_status_count{type=\"$proxy_type\", node=\"$node\", exported_service=\"$service\"}",
405401
"fullMetaSearch": false,
406402
"includeNullMetadata": false,
407403
"legendFormat": "{{status_code}}",
@@ -428,12 +424,12 @@
428424
"type": "prometheus",
429425
"uid": "${datasource}"
430426
},
431-
"definition": "label_values(proxy_node_count{job=\"$service\"},type)",
427+
"definition": "label_values(proxy_node_count{exported_service=\"$service\"},type)",
432428
"name": "proxy_type",
433429
"options": [],
434430
"query": {
435431
"qryType": 1,
436-
"query": "label_values(proxy_node_count{job=\"$service\"},type)",
432+
"query": "label_values(proxy_node_count{exported_service=\"$service\"},type)",
437433
"refId": "PrometheusVariableQueryEditor-VariableQuery"
438434
},
439435
"refresh": 1,
@@ -449,12 +445,12 @@
449445
"type": "prometheus",
450446
"uid": "${datasource}"
451447
},
452-
"definition": "label_values(proxy_request_count{type=\"$proxy_type\", job=\"$service\"},node)",
448+
"definition": "label_values(proxy_request_count{type=\"$proxy_type\", exported_service=\"$service\"},node)",
453449
"name": "node",
454450
"options": [],
455451
"query": {
456452
"qryType": 1,
457-
"query": "label_values(proxy_request_count{type=\"$proxy_type\", job=\"$service\"},node)",
453+
"query": "label_values(proxy_request_count{type=\"$proxy_type\", exported_service=\"$service\"},node)",
458454
"refId": "PrometheusVariableQueryEditor-VariableQuery"
459455
},
460456
"refresh": 1,
@@ -484,14 +480,14 @@
484480
"type": "prometheus",
485481
"uid": "${datasource}"
486482
},
487-
"definition": "label_values(proxy_node_count,job)",
483+
"definition": "label_values(proxy_node_count,exported_service)",
488484
"description": "Proxy service instance",
489485
"label": "Service",
490486
"name": "service",
491487
"options": [],
492488
"query": {
493489
"qryType": 1,
494-
"query": "label_values(proxy_node_count,job)",
490+
"query": "label_values(proxy_node_count,exported_service)",
495491
"refId": "PrometheusVariableQueryEditor-VariableQuery"
496492
},
497493
"refresh": 1,
@@ -508,5 +504,5 @@
508504
"timezone": "browser",
509505
"title": "Node Drilldown",
510506
"uid": "dejf2gnqpl5hca",
511-
"version": 11
507+
"version": 4
512508
}

deploy/grafana/provisioning/dashboards/overview.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
},
8585
"disableTextWrap": false,
8686
"editorMode": "builder",
87-
"expr": "proxy_node_count{job=\"$service\"}",
87+
"expr": "proxy_node_count{exported_service=\"$service\"}",
8888
"fullMetaSearch": false,
8989
"includeNullMetadata": true,
9090
"legendFormat": "{{type}}",
@@ -153,7 +153,7 @@
153153
},
154154
"disableTextWrap": false,
155155
"editorMode": "builder",
156-
"expr": "sum(rate(proxy_request_count{job=\"$service\"}[1m]))",
156+
"expr": "sum(rate(proxy_request_count{exported_service=\"$service\"}[1m]))",
157157
"fullMetaSearch": false,
158158
"includeNullMetadata": false,
159159
"legendFormat": "__auto",
@@ -278,7 +278,7 @@
278278
},
279279
"disableTextWrap": false,
280280
"editorMode": "builder",
281-
"expr": "sum(rate(proxy_request_count{job=\"$service\"}[1m]))",
281+
"expr": "sum(rate(proxy_request_count{exported_service=\"$service\"}[1m]))",
282282
"fullMetaSearch": false,
283283
"includeNullMetadata": false,
284284
"interval": "",
@@ -346,7 +346,7 @@
346346
},
347347
"disableTextWrap": false,
348348
"editorMode": "builder",
349-
"expr": "sum(proxy_request_count{job=\"$service\"})",
349+
"expr": "sum(proxy_request_count{exported_service=\"$service\"})",
350350
"fullMetaSearch": false,
351351
"includeNullMetadata": false,
352352
"legendFormat": "__auto",
@@ -460,7 +460,7 @@
460460
},
461461
"disableTextWrap": false,
462462
"editorMode": "builder",
463-
"expr": "rate(proxy_request_count{type=\"$proxy_type\", job=\"$service\"}[1m])",
463+
"expr": "rate(proxy_request_count{type=\"$proxy_type\", exported_service=\"$service\"}[1m])",
464464
"fullMetaSearch": false,
465465
"includeNullMetadata": true,
466466
"legendFormat": "{{node}}",
@@ -556,7 +556,7 @@
556556
},
557557
"disableTextWrap": false,
558558
"editorMode": "builder",
559-
"expr": "sum by(status_code) (rate(proxy_request_status_count{type=\"$proxy_type\", job=\"$service\"}[$__rate_interval]))",
559+
"expr": "sum by(status_code) (rate(proxy_request_status_count{type=\"$proxy_type\", exported_service=\"$service\"}[$__rate_interval]))",
560560
"fullMetaSearch": false,
561561
"includeNullMetadata": false,
562562
"legendFormat": "{{status_code}}",
@@ -651,7 +651,7 @@
651651
"disableTextWrap": false,
652652
"editorMode": "builder",
653653
"exemplar": false,
654-
"expr": "proxy_node_health{type=\"$proxy_type\", job=\"$service\"}",
654+
"expr": "proxy_node_health{type=\"$proxy_type\", exported_service=\"$service\"}",
655655
"fullMetaSearch": false,
656656
"includeNullMetadata": true,
657657
"instant": false,
@@ -689,7 +689,7 @@
689689
"type": "prometheus",
690690
"uid": "${datasource}"
691691
},
692-
"definition": "label_values(proxy_node_count{job=\"$service\"},type)",
692+
"definition": "label_values(proxy_node_count{exported_service=\"$service\"},type)",
693693
"hide": 1,
694694
"includeAll": true,
695695
"label": "Proxy Type",
@@ -698,7 +698,7 @@
698698
"options": [],
699699
"query": {
700700
"qryType": 1,
701-
"query": "label_values(proxy_node_count{job=\"$service\"},type)",
701+
"query": "label_values(proxy_node_count{exported_service=\"$service\"},type)",
702702
"refId": "PrometheusVariableQueryEditor-VariableQuery"
703703
},
704704
"refresh": 1,
@@ -728,14 +728,14 @@
728728
"type": "prometheus",
729729
"uid": "${datasource}"
730730
},
731-
"definition": "label_values(proxy_node_count,job)",
731+
"definition": "label_values(proxy_node_count,exported_service)",
732732
"description": "Proxy service instance",
733733
"label": "Service",
734734
"name": "service",
735735
"options": [],
736736
"query": {
737737
"qryType": 1,
738-
"query": "label_values(proxy_node_count,job)",
738+
"query": "label_values(proxy_node_count,exported_service)",
739739
"refId": "PrometheusVariableQueryEditor-VariableQuery"
740740
},
741741
"refresh": 1,
@@ -752,5 +752,5 @@
752752
"timezone": "browser",
753753
"title": "Proxy Overview",
754754
"uid": "dej3l52x401kwf",
755-
"version": 10
755+
"version": 4
756756
}

deploy/prometheus/prometheus.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ global:
55
scrape_configs:
66
- job_name: 'rpc-proxy'
77
static_configs:
8-
- targets: ['host.docker.internal:4000']
8+
- targets: ['host.docker.internal:4000']
9+
labels:
10+
service: 'rpc-proxy'

internal/config/config.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ type CORSConfig struct {
5858
}
5959

6060
type MetricsConfig struct {
61-
Enabled bool `mapstructure:"enabled"`
62-
Listen string `mapstructure:"listen"`
63-
Path string `mapstructure:"path"`
61+
Enabled bool `mapstructure:"enabled"`
62+
Listen string `mapstructure:"listen"`
63+
Path string `mapstructure:"path"`
64+
ServiceName string `mapstructure:"service-name"`
6465
}
6566

6667
type Config struct {

0 commit comments

Comments
 (0)