mirror of https://github.com/grafana/grafana.git
				
				
				
			Zipkin: Run health check through backend (#96031)
* Zipkin: Run health check through backend * Mark some errors as downstream * Update pkg/tsdb/zipkin/zipkin.go Co-authored-by: Will Browne <wbrowne@users.noreply.github.com> * Use errors.New where error formatting is not needed * Remove executable in plugin.json * Fix joining the path * Keep logger as global and then create from context * Close the res body --------- Co-authored-by: Will Browne <wbrowne@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									21ba507bcb
								
							
						
					
					
						commit
						4d0a7637b2
					
				| 
						 | 
					@ -276,6 +276,7 @@
 | 
				
			||||||
# OSS Big Tent backend code
 | 
					# OSS Big Tent backend code
 | 
				
			||||||
/pkg/tsdb/mysql/ @grafana/oss-big-tent
 | 
					/pkg/tsdb/mysql/ @grafana/oss-big-tent
 | 
				
			||||||
/pkg/tsdb/grafana-postgresql-datasource/ @grafana/oss-big-tent
 | 
					/pkg/tsdb/grafana-postgresql-datasource/ @grafana/oss-big-tent
 | 
				
			||||||
 | 
					/pkg/tsdb/zipkin/ @grafana/oss-big-tent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Partner Datasources backend code
 | 
					# Partner Datasources backend code
 | 
				
			||||||
/pkg/tsdb/mssql/ @grafana/partner-datasources
 | 
					/pkg/tsdb/mssql/ @grafana/partner-datasources
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								go.work.sum
								
								
								
								
							
							
						
						
									
										10
									
								
								go.work.sum
								
								
								
								
							| 
						 | 
					@ -717,6 +717,8 @@ github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3C
 | 
				
			||||||
github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0=
 | 
					github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0=
 | 
				
			||||||
github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs=
 | 
					github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs=
 | 
				
			||||||
github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0=
 | 
					github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0=
 | 
				
			||||||
 | 
					github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns=
 | 
				
			||||||
 | 
					github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw=
 | 
				
			||||||
github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY=
 | 
					github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY=
 | 
				
			||||||
github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o=
 | 
					github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o=
 | 
				
			||||||
github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
 | 
					github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
 | 
				
			||||||
| 
						 | 
					@ -780,6 +782,8 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k
 | 
				
			||||||
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
 | 
					github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
 | 
				
			||||||
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
 | 
					github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
 | 
				
			||||||
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
					github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
				
			||||||
 | 
					github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
 | 
				
			||||||
 | 
					github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
				
			||||||
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
 | 
					github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
 | 
				
			||||||
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
 | 
					github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
 | 
				
			||||||
github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8 h1:IMfrF5LCzP2Vhw7j4IIH3HxPsCLuZYjDqFAM/C88ulg=
 | 
					github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8 h1:IMfrF5LCzP2Vhw7j4IIH3HxPsCLuZYjDqFAM/C88ulg=
 | 
				
			||||||
| 
						 | 
					@ -793,6 +797,8 @@ github.com/drone/drone-yaml v1.2.3 h1:SWzLmzr8ARhbtw1WsVDENa8WFY2Pi9l0FVMfafVUWz
 | 
				
			||||||
github.com/drone/drone-yaml v1.2.3/go.mod h1:QsqliFK8nG04AHFN9tTn9XJomRBQHD4wcejWW1uz/10=
 | 
					github.com/drone/drone-yaml v1.2.3/go.mod h1:QsqliFK8nG04AHFN9tTn9XJomRBQHD4wcejWW1uz/10=
 | 
				
			||||||
github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1 h1:E8hjIYiEyI+1S2XZSLpMkqT9V8+YMljFNBWrFpuVM3A=
 | 
					github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1 h1:E8hjIYiEyI+1S2XZSLpMkqT9V8+YMljFNBWrFpuVM3A=
 | 
				
			||||||
github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1/go.mod h1:Hph0/pT6ZxbujnE1Z6/08p5I0XXuOsppqF6NQlGOK0E=
 | 
					github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1/go.mod h1:Hph0/pT6ZxbujnE1Z6/08p5I0XXuOsppqF6NQlGOK0E=
 | 
				
			||||||
 | 
					github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f h1:/jEs7lulqVO2u1+XI5rW4oFwIIusxuDOVKD9PAzlW2E=
 | 
				
			||||||
 | 
					github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f/go.mod h1:nDRkX7PHq+p39AD5/usv3KZMerxZTYU/9rfLS5IDspU=
 | 
				
			||||||
github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI=
 | 
					github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI=
 | 
				
			||||||
github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415 h1:q1oJaUPdmpDm/VyXosjgPgr6wS7c5iV2p0PwJD73bUI=
 | 
					github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415 h1:q1oJaUPdmpDm/VyXosjgPgr6wS7c5iV2p0PwJD73bUI=
 | 
				
			||||||
github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
 | 
					github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
 | 
				
			||||||
| 
						 | 
					@ -1047,6 +1053,8 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8
 | 
				
			||||||
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
 | 
					github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
 | 
				
			||||||
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
 | 
					github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
 | 
				
			||||||
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
 | 
					github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
 | 
				
			||||||
 | 
					github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
 | 
				
			||||||
 | 
					github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
 | 
				
			||||||
github.com/jon-whit/go-grpc-prometheus v1.4.0 h1:/wmpGDJcLXuEjXryWhVYEGt9YBRhtLwFEN7T+Flr8sw=
 | 
					github.com/jon-whit/go-grpc-prometheus v1.4.0 h1:/wmpGDJcLXuEjXryWhVYEGt9YBRhtLwFEN7T+Flr8sw=
 | 
				
			||||||
github.com/jon-whit/go-grpc-prometheus v1.4.0/go.mod h1:iTPm+Iuhh3IIqR0iGZ91JJEg5ax6YQEe1I0f6vtBuao=
 | 
					github.com/jon-whit/go-grpc-prometheus v1.4.0/go.mod h1:iTPm+Iuhh3IIqR0iGZ91JJEg5ax6YQEe1I0f6vtBuao=
 | 
				
			||||||
github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a h1:sfe532Ipn7GX0V6mHdynBk393rDmqgI0QmjLK7ct7TU=
 | 
					github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a h1:sfe532Ipn7GX0V6mHdynBk393rDmqgI0QmjLK7ct7TU=
 | 
				
			||||||
| 
						 | 
					@ -1327,6 +1335,8 @@ github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97/go.
 | 
				
			||||||
github.com/prometheus/statsd_exporter v0.26.0 h1:SQl3M6suC6NWQYEzOvIv+EF6dAMYEqIuZy+o4H9F5Ig=
 | 
					github.com/prometheus/statsd_exporter v0.26.0 h1:SQl3M6suC6NWQYEzOvIv+EF6dAMYEqIuZy+o4H9F5Ig=
 | 
				
			||||||
github.com/prometheus/statsd_exporter v0.26.0/go.mod h1:GXFLADOmBTVDrHc7b04nX8ooq3azG61pnECNqT7O5DM=
 | 
					github.com/prometheus/statsd_exporter v0.26.0/go.mod h1:GXFLADOmBTVDrHc7b04nX8ooq3azG61pnECNqT7O5DM=
 | 
				
			||||||
github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b/go.mod h1:KjY0wibdYKc4DYkerHSbguaf3JeIPGhNJBp2BNiFH78=
 | 
					github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b/go.mod h1:KjY0wibdYKc4DYkerHSbguaf3JeIPGhNJBp2BNiFH78=
 | 
				
			||||||
 | 
					github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc3Aoo=
 | 
				
			||||||
 | 
					github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc=
 | 
				
			||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
 | 
					github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
 | 
				
			||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 | 
					github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 | 
				
			||||||
github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs=
 | 
					github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,7 @@ func TestCallResource(t *testing.T) {
 | 
				
			||||||
	cfg.Azure = &azsettings.AzureSettings{}
 | 
						cfg.Azure = &azsettings.AzureSettings{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), nil, &cloudwatch.CloudWatchService{}, nil, nil, nil, nil,
 | 
						coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), nil, &cloudwatch.CloudWatchService{}, nil, nil, nil, nil,
 | 
				
			||||||
		nil, nil, nil, nil, testdatasource.ProvideService(), nil, nil, nil, nil, nil, nil)
 | 
							nil, nil, nil, nil, testdatasource.ProvideService(), nil, nil, nil, nil, nil, nil, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	testCtx := pluginsintegration.CreateIntegrationTestCtx(t, cfg, coreRegistry)
 | 
						testCtx := pluginsintegration.CreateIntegrationTestCtx(t, cfg, coreRegistry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ require (
 | 
				
			||||||
	github.com/Masterminds/semver/v3 v3.2.0 // @grafana/grafana-developer-enablement-squad
 | 
						github.com/Masterminds/semver/v3 v3.2.0 // @grafana/grafana-developer-enablement-squad
 | 
				
			||||||
	github.com/aws/aws-sdk-go v1.55.5 // @grafana/aws-datasources
 | 
						github.com/aws/aws-sdk-go v1.55.5 // @grafana/aws-datasources
 | 
				
			||||||
	github.com/docker/docker v27.3.1+incompatible // @grafana/grafana-developer-enablement-squad
 | 
						github.com/docker/docker v27.3.1+incompatible // @grafana/grafana-developer-enablement-squad
 | 
				
			||||||
	github.com/drone/drone-cli v1.6.1 // @grafana/grafana-developer-enablement-squad
 | 
						github.com/drone/drone-cli v1.8.0 // @grafana/grafana-developer-enablement-squad
 | 
				
			||||||
	github.com/gogo/protobuf v1.3.2 // indirect; @grafana/alerting-backend
 | 
						github.com/gogo/protobuf v1.3.2 // indirect; @grafana/alerting-backend
 | 
				
			||||||
	github.com/google/go-cmp v0.6.0 // @grafana/grafana-backend-group
 | 
						github.com/google/go-cmp v0.6.0 // @grafana/grafana-backend-group
 | 
				
			||||||
	github.com/google/go-github v17.0.0+incompatible // @grafana/grafana-developer-enablement-squad
 | 
						github.com/google/go-github v17.0.0+incompatible // @grafana/grafana-developer-enablement-squad
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,7 @@ require (
 | 
				
			||||||
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 | 
						github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 | 
				
			||||||
	github.com/docker/go-connections v0.5.0 // indirect
 | 
						github.com/docker/go-connections v0.5.0 // indirect
 | 
				
			||||||
	github.com/docker/go-units v0.5.0 // indirect
 | 
						github.com/docker/go-units v0.5.0 // indirect
 | 
				
			||||||
	github.com/drone-runners/drone-runner-docker v1.8.2 // indirect
 | 
						github.com/drone-runners/drone-runner-docker v1.8.3 // indirect
 | 
				
			||||||
	github.com/drone/drone-go v1.7.1 // indirect
 | 
						github.com/drone/drone-go v1.7.1 // indirect
 | 
				
			||||||
	github.com/drone/envsubst v1.0.3 // indirect
 | 
						github.com/drone/envsubst v1.0.3 // indirect
 | 
				
			||||||
	github.com/drone/runner-go v1.12.0 // indirect
 | 
						github.com/drone/runner-go v1.12.0 // indirect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,10 +72,10 @@ github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6
 | 
				
			||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
					github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
				
			||||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
 | 
					github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
 | 
				
			||||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
					github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
				
			||||||
github.com/drone-runners/drone-runner-docker v1.8.2 h1:F7+39FSyzEUqLXYMvTdTGBhCS79ODDIhw3DQeF5GYT8=
 | 
					github.com/drone-runners/drone-runner-docker v1.8.3 h1:uUnC45C1JMSLW+9uy6RoKG5ugzeXWN89pygs9BMLObY=
 | 
				
			||||||
github.com/drone-runners/drone-runner-docker v1.8.2/go.mod h1:JR3pZeVZKKpkbTajiq0YtAx9WutkODdVKZGNR83kEwE=
 | 
					github.com/drone-runners/drone-runner-docker v1.8.3/go.mod h1:JR3pZeVZKKpkbTajiq0YtAx9WutkODdVKZGNR83kEwE=
 | 
				
			||||||
github.com/drone/drone-cli v1.6.1 h1:Beh0opEGR5XYezOyOmiqWzTMBGHkGDrh2tIG1cY/5GY=
 | 
					github.com/drone/drone-cli v1.8.0 h1:tpp+GPonS87IKMZCGbIoa+zfDwiuJDL3NIC6S7neNrU=
 | 
				
			||||||
github.com/drone/drone-cli v1.6.1/go.mod h1://HC780Gua3Nhob/I2VPL3nTqmleEE/HIhGhTcJb2ds=
 | 
					github.com/drone/drone-cli v1.8.0/go.mod h1:zu6/7OpQjWBw/5VG0M3K4iJc6kSoTrjnY7CRLBrGH84=
 | 
				
			||||||
github.com/drone/drone-go v1.7.1 h1:ZX+3Rs8YHUSUQ5mkuMLmm1zr1ttiiE2YGNxF3AnyDKw=
 | 
					github.com/drone/drone-go v1.7.1 h1:ZX+3Rs8YHUSUQ5mkuMLmm1zr1ttiiE2YGNxF3AnyDKw=
 | 
				
			||||||
github.com/drone/drone-go v1.7.1/go.mod h1:fxCf9jAnXDZV1yDr0ckTuWd1intvcQwfJmTRpTZ1mXg=
 | 
					github.com/drone/drone-go v1.7.1/go.mod h1:fxCf9jAnXDZV1yDr0ckTuWd1intvcQwfJmTRpTZ1mXg=
 | 
				
			||||||
github.com/drone/envsubst v1.0.2/go.mod h1:bkZbnc/2vh1M12Ecn7EYScpI4YGYU0etwLJICOWi8Z0=
 | 
					github.com/drone/envsubst v1.0.2/go.mod h1:bkZbnc/2vh1M12Ecn7EYScpI4YGYU0etwLJICOWi8Z0=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,7 @@ import (
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/parca"
 | 
						"github.com/grafana/grafana/pkg/tsdb/parca"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/prometheus"
 | 
						"github.com/grafana/grafana/pkg/tsdb/prometheus"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/tempo"
 | 
						"github.com/grafana/grafana/pkg/tsdb/tempo"
 | 
				
			||||||
 | 
						"github.com/grafana/grafana/pkg/tsdb/zipkin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -55,6 +56,7 @@ const (
 | 
				
			||||||
	Grafana         = "grafana"
 | 
						Grafana         = "grafana"
 | 
				
			||||||
	Pyroscope       = "grafana-pyroscope-datasource"
 | 
						Pyroscope       = "grafana-pyroscope-datasource"
 | 
				
			||||||
	Parca           = "parca"
 | 
						Parca           = "parca"
 | 
				
			||||||
 | 
						Zipkin          = "zipkin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
| 
						 | 
					@ -93,7 +95,7 @@ func NewRegistry(store map[string]backendplugin.PluginFactoryFunc) *Registry {
 | 
				
			||||||
func ProvideCoreRegistry(tracer tracing.Tracer, am *azuremonitor.Service, cw *cloudwatch.CloudWatchService, cm *cloudmonitoring.Service,
 | 
					func ProvideCoreRegistry(tracer tracing.Tracer, am *azuremonitor.Service, cw *cloudwatch.CloudWatchService, cm *cloudmonitoring.Service,
 | 
				
			||||||
	es *elasticsearch.Service, grap *graphite.Service, idb *influxdb.Service, lk *loki.Service, otsdb *opentsdb.Service,
 | 
						es *elasticsearch.Service, grap *graphite.Service, idb *influxdb.Service, lk *loki.Service, otsdb *opentsdb.Service,
 | 
				
			||||||
	pr *prometheus.Service, t *tempo.Service, td *testdatasource.Service, pg *postgres.Service, my *mysql.Service,
 | 
						pr *prometheus.Service, t *tempo.Service, td *testdatasource.Service, pg *postgres.Service, my *mysql.Service,
 | 
				
			||||||
	ms *mssql.Service, graf *grafanads.Service, pyroscope *pyroscope.Service, parca *parca.Service) *Registry {
 | 
						ms *mssql.Service, graf *grafanads.Service, pyroscope *pyroscope.Service, parca *parca.Service, zipkin *zipkin.Service) *Registry {
 | 
				
			||||||
	// Non-optimal global solution to replace plugin SDK default tracer for core plugins.
 | 
						// Non-optimal global solution to replace plugin SDK default tracer for core plugins.
 | 
				
			||||||
	sdktracing.InitDefaultTracer(tracer)
 | 
						sdktracing.InitDefaultTracer(tracer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,6 +117,7 @@ func ProvideCoreRegistry(tracer tracing.Tracer, am *azuremonitor.Service, cw *cl
 | 
				
			||||||
		Grafana:         asBackendPlugin(graf),
 | 
							Grafana:         asBackendPlugin(graf),
 | 
				
			||||||
		Pyroscope:       asBackendPlugin(pyroscope),
 | 
							Pyroscope:       asBackendPlugin(pyroscope),
 | 
				
			||||||
		Parca:           asBackendPlugin(parca),
 | 
							Parca:           asBackendPlugin(parca),
 | 
				
			||||||
 | 
							Zipkin:          asBackendPlugin(zipkin),
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -239,6 +242,8 @@ func NewPlugin(pluginID string, cfg *setting.Cfg, httpClientProvider *httpclient
 | 
				
			||||||
		svc = pyroscope.ProvideService(httpClientProvider)
 | 
							svc = pyroscope.ProvideService(httpClientProvider)
 | 
				
			||||||
	case Parca:
 | 
						case Parca:
 | 
				
			||||||
		svc = parca.ProvideService(httpClientProvider)
 | 
							svc = parca.ProvideService(httpClientProvider)
 | 
				
			||||||
 | 
						case Zipkin:
 | 
				
			||||||
 | 
							svc = zipkin.ProvideService(httpClientProvider)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return nil, ErrCorePluginNotFound
 | 
							return nil, ErrCorePluginNotFound
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@ func TestNewPlugin(t *testing.T) {
 | 
				
			||||||
		{ID: Tempo},
 | 
							{ID: Tempo},
 | 
				
			||||||
		{ID: TestData, ExpectedAlias: TestDataAlias},
 | 
							{ID: TestData, ExpectedAlias: TestDataAlias},
 | 
				
			||||||
		{ID: TestDataAlias, ExpectedID: TestData, ExpectedAlias: TestDataAlias},
 | 
							{ID: TestDataAlias, ExpectedID: TestData, ExpectedAlias: TestDataAlias},
 | 
				
			||||||
 | 
							{ID: Zipkin},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, tc := range tcs {
 | 
						for _, tc := range tcs {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,6 +173,7 @@ import (
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/parca"
 | 
						"github.com/grafana/grafana/pkg/tsdb/parca"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/prometheus"
 | 
						"github.com/grafana/grafana/pkg/tsdb/prometheus"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/tempo"
 | 
						"github.com/grafana/grafana/pkg/tsdb/tempo"
 | 
				
			||||||
 | 
						"github.com/grafana/grafana/pkg/tsdb/zipkin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var wireBasicSet = wire.NewSet(
 | 
					var wireBasicSet = wire.NewSet(
 | 
				
			||||||
| 
						 | 
					@ -267,6 +268,7 @@ var wireBasicSet = wire.NewSet(
 | 
				
			||||||
	elasticsearch.ProvideService,
 | 
						elasticsearch.ProvideService,
 | 
				
			||||||
	pyroscope.ProvideService,
 | 
						pyroscope.ProvideService,
 | 
				
			||||||
	parca.ProvideService,
 | 
						parca.ProvideService,
 | 
				
			||||||
 | 
						zipkin.ProvideService,
 | 
				
			||||||
	datasourceservice.ProvideCacheService,
 | 
						datasourceservice.ProvideCacheService,
 | 
				
			||||||
	wire.Bind(new(datasources.CacheService), new(*datasourceservice.CacheServiceImpl)),
 | 
						wire.Bind(new(datasources.CacheService), new(*datasourceservice.CacheServiceImpl)),
 | 
				
			||||||
	encryptionservice.ProvideEncryptionService,
 | 
						encryptionservice.ProvideEncryptionService,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@ import (
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/parca"
 | 
						"github.com/grafana/grafana/pkg/tsdb/parca"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/prometheus"
 | 
						"github.com/grafana/grafana/pkg/tsdb/prometheus"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/tsdb/tempo"
 | 
						"github.com/grafana/grafana/pkg/tsdb/tempo"
 | 
				
			||||||
 | 
						"github.com/grafana/grafana/pkg/tsdb/zipkin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestMain(m *testing.M) {
 | 
					func TestMain(m *testing.M) {
 | 
				
			||||||
| 
						 | 
					@ -94,7 +95,8 @@ func TestIntegrationPluginManager(t *testing.T) {
 | 
				
			||||||
	graf := grafanads.ProvideService(sv2, nil, nil, features)
 | 
						graf := grafanads.ProvideService(sv2, nil, nil, features)
 | 
				
			||||||
	pyroscope := pyroscope.ProvideService(hcp)
 | 
						pyroscope := pyroscope.ProvideService(hcp)
 | 
				
			||||||
	parca := parca.ProvideService(hcp)
 | 
						parca := parca.ProvideService(hcp)
 | 
				
			||||||
	coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), am, cw, cm, es, grap, idb, lk, otsdb, pr, tmpo, td, pg, my, ms, graf, pyroscope, parca)
 | 
						zipkin := zipkin.ProvideService(hcp)
 | 
				
			||||||
 | 
						coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), am, cw, cm, es, grap, idb, lk, otsdb, pr, tmpo, td, pg, my, ms, graf, pyroscope, parca, zipkin)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	testCtx := CreateIntegrationTestCtx(t, cfg, coreRegistry)
 | 
						testCtx := CreateIntegrationTestCtx(t, cfg, coreRegistry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					package zipkin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/grafana/grafana-plugin-sdk-go/backend"
 | 
				
			||||||
 | 
						"github.com/grafana/grafana-plugin-sdk-go/backend/log"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ZipkinClient struct {
 | 
				
			||||||
 | 
						logger     log.Logger
 | 
				
			||||||
 | 
						url        string
 | 
				
			||||||
 | 
						httpClient *http.Client
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func New(url string, hc *http.Client, logger log.Logger) (ZipkinClient, error) {
 | 
				
			||||||
 | 
						client := ZipkinClient{
 | 
				
			||||||
 | 
							logger:     logger,
 | 
				
			||||||
 | 
							url:        url,
 | 
				
			||||||
 | 
							httpClient: hc,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return client, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Services returns list of services
 | 
				
			||||||
 | 
					// https://zipkin.io/zipkin-api/#/default/get_services
 | 
				
			||||||
 | 
					func (z *ZipkinClient) Services() ([]string, error) {
 | 
				
			||||||
 | 
						services := []string{}
 | 
				
			||||||
 | 
						u, err := url.JoinPath(z.url, "/api/v2/services")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return services, backend.DownstreamError(fmt.Errorf("failed to join url: %w", err))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						res, err := z.httpClient.Get(u)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return services, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							if err = res.Body.Close(); err != nil {
 | 
				
			||||||
 | 
								z.logger.Error("Failed to close response body", "error", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						if err := json.NewDecoder(res.Body).Decode(&services); err != nil {
 | 
				
			||||||
 | 
							return services, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return services, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,83 @@
 | 
				
			||||||
 | 
					package zipkin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/grafana/grafana-plugin-sdk-go/backend"
 | 
				
			||||||
 | 
						"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
 | 
				
			||||||
 | 
						"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/grafana/grafana/pkg/infra/httpclient"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var logger = backend.NewLoggerWith("logger", "tsdb.zipkin")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Service struct {
 | 
				
			||||||
 | 
						im instancemgmt.InstanceManager
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ProvideService(httpClientProvider httpclient.Provider) *Service {
 | 
				
			||||||
 | 
						return &Service{
 | 
				
			||||||
 | 
							im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type datasourceInfo struct {
 | 
				
			||||||
 | 
						ZipkinClient ZipkinClient
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc {
 | 
				
			||||||
 | 
						return func(ctx context.Context, settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) {
 | 
				
			||||||
 | 
							httpClientOptions, err := settings.HTTPClientOptions(ctx)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, backend.DownstreamError(fmt.Errorf("error reading settings: %w", err))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							httpClient, err := httpClientProvider.New(httpClientOptions)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("error creating http client: %w", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if settings.URL == "" {
 | 
				
			||||||
 | 
								return nil, backend.DownstreamError(errors.New("error reading settings: url is empty"))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							logger := logger.FromContext(ctx)
 | 
				
			||||||
 | 
							zipkinClient, err := New(settings.URL, httpClient, logger)
 | 
				
			||||||
 | 
							return &datasourceInfo{ZipkinClient: zipkinClient}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*datasourceInfo, error) {
 | 
				
			||||||
 | 
						i, err := s.im.Get(ctx, pluginCtx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						instance, ok := i.(*datasourceInfo)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return nil, errors.New("failed to cast datasource info")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return instance, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
 | 
				
			||||||
 | 
						client, err := s.getDSInfo(ctx, backend.PluginConfigFromContext(ctx))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return &backend.CheckHealthResult{
 | 
				
			||||||
 | 
								Status:  backend.HealthStatusError,
 | 
				
			||||||
 | 
								Message: err.Error(),
 | 
				
			||||||
 | 
							}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if _, err = client.ZipkinClient.Services(); err != nil {
 | 
				
			||||||
 | 
							return &backend.CheckHealthResult{
 | 
				
			||||||
 | 
								Status:  backend.HealthStatusError,
 | 
				
			||||||
 | 
								Message: err.Error(),
 | 
				
			||||||
 | 
							}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &backend.CheckHealthResult{
 | 
				
			||||||
 | 
							Status:  backend.HealthStatusOk,
 | 
				
			||||||
 | 
							Message: "Data source is working",
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,6 @@ import { map } from 'rxjs/operators';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  DataQueryRequest,
 | 
					  DataQueryRequest,
 | 
				
			||||||
  DataQueryResponse,
 | 
					  DataQueryResponse,
 | 
				
			||||||
  DataSourceApi,
 | 
					 | 
				
			||||||
  DataSourceInstanceSettings,
 | 
					  DataSourceInstanceSettings,
 | 
				
			||||||
  DataSourceJsonData,
 | 
					  DataSourceJsonData,
 | 
				
			||||||
  FieldType,
 | 
					  FieldType,
 | 
				
			||||||
| 
						 | 
					@ -13,7 +12,15 @@ import {
 | 
				
			||||||
  urlUtil,
 | 
					  urlUtil,
 | 
				
			||||||
} from '@grafana/data';
 | 
					} from '@grafana/data';
 | 
				
			||||||
import { NodeGraphOptions, SpanBarOptions } from '@grafana/o11y-ds-frontend';
 | 
					import { NodeGraphOptions, SpanBarOptions } from '@grafana/o11y-ds-frontend';
 | 
				
			||||||
import { BackendSrvRequest, FetchResponse, getBackendSrv, getTemplateSrv, TemplateSrv } from '@grafana/runtime';
 | 
					import {
 | 
				
			||||||
 | 
					  BackendSrvRequest,
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  DataSourceWithBackend,
 | 
				
			||||||
 | 
					  FetchResponse,
 | 
				
			||||||
 | 
					  getBackendSrv,
 | 
				
			||||||
 | 
					  getTemplateSrv,
 | 
				
			||||||
 | 
					  TemplateSrv,
 | 
				
			||||||
 | 
					} from '@grafana/runtime';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { apiPrefix } from './constants';
 | 
					import { apiPrefix } from './constants';
 | 
				
			||||||
import { ZipkinQuery, ZipkinSpan } from './types';
 | 
					import { ZipkinQuery, ZipkinSpan } from './types';
 | 
				
			||||||
| 
						 | 
					@ -24,7 +31,7 @@ export interface ZipkinJsonData extends DataSourceJsonData {
 | 
				
			||||||
  nodeGraph?: NodeGraphOptions;
 | 
					  nodeGraph?: NodeGraphOptions;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class ZipkinDatasource extends DataSourceApi<ZipkinQuery, ZipkinJsonData> {
 | 
					export class ZipkinDatasource extends DataSourceWithBackend<ZipkinQuery, ZipkinJsonData> {
 | 
				
			||||||
  uploadedJson: string | ArrayBuffer | null = null;
 | 
					  uploadedJson: string | ArrayBuffer | null = null;
 | 
				
			||||||
  nodeGraph?: NodeGraphOptions;
 | 
					  nodeGraph?: NodeGraphOptions;
 | 
				
			||||||
  spanBar?: SpanBarOptions;
 | 
					  spanBar?: SpanBarOptions;
 | 
				
			||||||
| 
						 | 
					@ -66,6 +73,10 @@ export class ZipkinDatasource extends DataSourceApi<ZipkinQuery, ZipkinJsonData>
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async testDatasource(): Promise<{ status: string; message: string }> {
 | 
					  async testDatasource(): Promise<{ status: string; message: string }> {
 | 
				
			||||||
 | 
					    if (config.featureToggles.zipkinBackendMigration) {
 | 
				
			||||||
 | 
					      return await super.testDatasource();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await this.metadataRequest(`${apiPrefix}/services`);
 | 
					    await this.metadataRequest(`${apiPrefix}/services`);
 | 
				
			||||||
    return { status: 'success', message: 'Data source is working' };
 | 
					    return { status: 'success', message: 'Data source is working' };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
  "id": "zipkin",
 | 
					  "id": "zipkin",
 | 
				
			||||||
  "category": "tracing",
 | 
					  "category": "tracing",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  "backend": true,
 | 
				
			||||||
  "metrics": true,
 | 
					  "metrics": true,
 | 
				
			||||||
  "alerting": false,
 | 
					  "alerting": false,
 | 
				
			||||||
  "annotations": false,
 | 
					  "annotations": false,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue