From 8205aeccf71cacab68a26f77a670189aae8cae30 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 15:06:43 +0000 Subject: [PATCH 01/14] Update local example to mention the path ownership required --- example/docker-compose/local/readme.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/example/docker-compose/local/readme.md b/example/docker-compose/local/readme.md index 814b4e50a0c..0cb1d75fd7d 100644 --- a/example/docker-compose/local/readme.md +++ b/example/docker-compose/local/readme.md @@ -1,10 +1,16 @@ ## Local Storage -In this example all data is stored locally in the `tempo-data` folder. Local storage is fine for experimenting with Tempo -or when using the single binary, but does not work in a distributed/microservices scenario. -1. First start up the local stack. +In this example all data is stored locally in the `tempo-data` folder. Local +storage is fine for experimenting with Tempo or when using the single binary, +but does not work in a distributed/microservices scenario. The container runs +as non-root, and so the local directory needs to have the appropriate +permissions set in order to start correctly. + +1. First create the storage directory with the correct permissions and start up the local stack. ```console +mkdir tempo-data/ +sudo chown 10001:10001 tempo-data/ docker-compose up -d ``` From fec98834ad93e2be61851dea7db641ee6c29919e Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:02:09 +0000 Subject: [PATCH 02/14] Drop grafana7.4 docker-compose example --- .../grafana7.4/docker-compose.yaml | 51 -- .../grafana7.4/grafana-datasources.yaml | 23 - .../grafana7.4/load-generator.json | 630 ------------------ example/docker-compose/grafana7.4/readme.md | 61 -- .../grafana7.4/tempo-query.yaml | 1 - example/docker-compose/readme.md | 2 - 6 files changed, 768 deletions(-) delete mode 100644 example/docker-compose/grafana7.4/docker-compose.yaml delete mode 100644 example/docker-compose/grafana7.4/grafana-datasources.yaml delete mode 100644 example/docker-compose/grafana7.4/load-generator.json delete mode 100644 example/docker-compose/grafana7.4/readme.md delete mode 100644 example/docker-compose/grafana7.4/tempo-query.yaml diff --git a/example/docker-compose/grafana7.4/docker-compose.yaml b/example/docker-compose/grafana7.4/docker-compose.yaml deleted file mode 100644 index 6ebc20f95b6..00000000000 --- a/example/docker-compose/grafana7.4/docker-compose.yaml +++ /dev/null @@ -1,51 +0,0 @@ -version: "3" -services: - - tempo: - image: grafana/tempo:latest - command: [ "-config.file=/etc/tempo.yaml" ] - volumes: - - ../shared/tempo.yaml:/etc/tempo.yaml - - ./tempo-data/:/var/tempo - ports: - - "14268" # jaeger ingest - - "3200" # tempo - - tempo-query: - image: grafana/tempo-query:latest - command: [ "--grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml" ] - volumes: - - ./tempo-query.yaml:/etc/tempo-query.yaml - ports: - - "16686:16686" # jaeger-ui - depends_on: - - tempo - - synthetic-load-generator: - image: omnition/synthetic-load-generator:1.0.25 - volumes: - - ./load-generator.json:/etc/load-generator.json - environment: - - TOPOLOGY_FILE=/etc/load-generator.json - - JAEGER_COLLECTOR_URL=http://tempo:14268 - depends_on: - - tempo - - prometheus: - image: prom/prometheus:latest - command: [ "--config.file=/etc/prometheus.yaml" ] - volumes: - - ../shared/prometheus.yaml:/etc/prometheus.yaml - ports: - - "9090:9090" - - grafana: - image: grafana/grafana:7.4.5 - volumes: - - ./grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml - environment: - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_AUTH_DISABLE_LOGIN_FORM=true - ports: - - "3000:3000" \ No newline at end of file diff --git a/example/docker-compose/grafana7.4/grafana-datasources.yaml b/example/docker-compose/grafana7.4/grafana-datasources.yaml deleted file mode 100644 index 77932580280..00000000000 --- a/example/docker-compose/grafana7.4/grafana-datasources.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: 1 - -datasources: -- name: Prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://prometheus:9090 - basicAuth: false - isDefault: false - version: 1 - editable: false -- name: 'Tempo-Query (Grafana 7.4)' # tempo-query is required for 7.4.x Grafana and before - type: tempo - access: proxy - orgId: 1 - url: http://tempo-query:16686 - basicAuth: false - isDefault: true - version: 1 - editable: false - apiVersion: 1 - uid: tempo-query \ No newline at end of file diff --git a/example/docker-compose/grafana7.4/load-generator.json b/example/docker-compose/grafana7.4/load-generator.json deleted file mode 100644 index b62b36f6dc6..00000000000 --- a/example/docker-compose/grafana7.4/load-generator.json +++ /dev/null @@ -1,630 +0,0 @@ -{ - "topology": { - "services": [ - { - "serviceName": "frontend", - "tagSets": [ - { - "weight": 1, - "tags": { - "version": "v127", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - }, - { - "weight": 1, - "tags": { - "version": "v125", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - }, - { - "weight": 2, - "tags": { - "version": "v125", - "region": "us-west-1" - }, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - } - ], - "routes": [ - { - "route": "/product", - "downstreamCalls": { - "productcatalogservice": "/GetProducts", - "recommendationservice": "/GetRecommendations", - "adservice": "/AdRequest" - }, - "tagSets": [ - { - "weight": 1, - "tags": { - "starter": "charmander" - }, - "tagGenerators": [ - { - "rand": { - "seed": 179867746078676, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - }, - "tagGen": {}, - "valLength": 16, - "numTags": 50, - "numVals": 3000 - } - ], - "inherit": [] - }, - { - "weight": 1, - "tags": { - "starter": "squirtle" - }, - "tagGenerators": [], - "inherit": [] - }, - { - "weight": 1, - "tags": { - "starter": "bulbasaur" - }, - "tagGenerators": [], - "inherit": [] - } - ] - }, - { - "route": "/cart", - "downstreamCalls": { - "cartservice": "/GetCart", - "recommendationservice": "/GetRecommendations" - }, - "tagSets": [] - }, - { - "route": "/checkout", - "downstreamCalls": { - "checkoutservice": "/PlaceOrder" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 800 - } - ] - }, - { - "route": "/shipping", - "downstreamCalls": { - "shippingservice": "/GetQuote" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 50 - } - ] - }, - { - "route": "/currency", - "downstreamCalls": { - "currencyservice": "/GetConversion" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 50 - } - ] - } - ], - "instances": [ - "frontend-6b654dbf57-zq8dt", - "frontend-d847fdcf5-j6s2f", - "frontend-79d8c8d6c8-9sbff" - ], - "mergedTagSets": {}, - "random": { - "seed": 187004238864083, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "productcatalogservice", - "tagSets": [ - { - "tags": { - "version": "v52" - }, - "tagGenerators": [], - "inherit": [ - "region" - ] - } - ], - "routes": [ - { - "route": "/GetProducts", - "downstreamCalls": {}, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [ - "starter" - ], - "maxLatency": 100 - } - ] - }, - { - "route": "/SearchProducts", - "downstreamCalls": {}, - "tagSets": [ - { - "weight": 15, - "tags": { - "error": true, - "http.status_code": 503 - }, - "tagGenerators": [], - "inherit": [], - "maxLatency": 400 - }, - { - "weight": 85, - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 400 - } - ] - } - ], - "instances": [ - "productcatalogservice-6b654dbf57-zq8dt", - "productcatalogservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 238238032670139, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "recommendationservice", - "tagSets": [ - { - "tags": { - "version": "v234", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [] - } - ], - "routes": [ - { - "route": "/GetRecommendations", - "downstreamCalls": { - "productcatalogservice": "/GetProducts" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 200 - } - ] - } - ], - "instances": [ - "recommendationservice-6b654dbf57-zq8dt", - "recommendationservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 66295214032801, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "cartservice", - "tagSets": [ - { - "tags": { - "version": "v5", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [] - } - ], - "routes": [ - { - "route": "/GetCart", - "downstreamCalls": {}, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 200 - } - ] - } - ], - "instances": [ - "cartservice-6b654dbf57-zq8dt", - "cartservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 234194353561392, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "checkoutservice", - "tagSets": [ - { - "tags": { - "version": "v37", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [], - "maxLatency": 500 - } - ], - "routes": [ - { - "route": "/PlaceOrder", - "downstreamCalls": { - "paymentservice": "/CreditCardInfo", - "shippingservice": "/Address", - "currencyservice": "/GetConversion", - "cartservice": "/GetCart", - "emailservice": "/SendOrderConfirmation" - }, - "tagSets": [ - { - "weight": 25, - "tags": { - "error": true, - "http.status_code": 503 - }, - "tagGenerators": [], - "inherit": [] - }, - { - "weight": 85, - "tags": {}, - "tagGenerators": [], - "inherit": [] - } - ] - } - ], - "instances": [ - "checkoutservice-6b654dbf57-zq8dt", - "checkoutservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 60782549660568, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "paymentservice", - "tagSets": [ - { - "tags": { - "version": "v177", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [] - } - ], - "routes": [ - { - "route": "/ChargeRequest", - "downstreamCalls": { - "paymentservice": "/CreditCardInfo" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 700 - } - ] - }, - { - "route": "/CreditCardInfo", - "downstreamCalls": {}, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 50 - } - ] - } - ], - "instances": [ - "paymentservice-6b654dbf57-zq8dt", - "paymentservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 174850031049111, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "shippingservice", - "tagSets": [ - { - "tags": { - "version": "v127", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [] - } - ], - "routes": [ - { - "route": "/GetQuote", - "downstreamCalls": { - "shippingservice": "/Address" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 250 - } - ] - }, - { - "route": "/ShipOrder", - "downstreamCalls": { - "shippingservice": "/Address" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 500 - } - ] - }, - { - "route": "/Address", - "downstreamCalls": {}, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - } - ] - } - ], - "instances": [ - "shippingservice-6b654dbf57-zq8dt", - "shippingservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 107892261530518, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "emailservice", - "tagSets": [ - { - "tags": { - "version": "v27", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [], - "maxLatency": 500 - } - ], - "routes": [ - { - "route": "/SendOrderConfirmation", - "downstreamCalls": { - "emailservice": "/OrderResult" - }, - "tagSets": [ - { - "weight": 15, - "tags": { - "error": true, - "http.status_code": 503 - }, - "tagGenerators": [], - "inherit": [] - }, - { - "weight": 85, - "tags": {}, - "tagGenerators": [], - "inherit": [] - } - ] - }, - { - "route": "/OrderResult", - "downstreamCalls": {}, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - } - ] - } - ], - "instances": [ - "emailservice-6b654dbf57-zq8dt", - "emailservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 61175057559946, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "currencyservice", - "tagSets": [ - { - "tags": { - "version": "v27", - "region": "us-east-1" - }, - "tagGenerators": [], - "inherit": [] - } - ], - "routes": [ - { - "route": "/GetConversion", - "downstreamCalls": { - "currencyservice": "/Money" - }, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - } - ] - }, - { - "route": "/Money", - "downstreamCalls": {}, - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 100 - } - ] - } - ], - "instances": [ - "currencyservice-6b654dbf57-zq8dt", - "currencyservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 66219471499700, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - }, - { - "serviceName": "adservice", - "tagSets": [ - { - "tags": {}, - "tagGenerators": [], - "inherit": [], - "maxLatency": 500 - } - ], - "routes": [ - { - "route": "/AdRequest", - "downstreamCalls": {}, - "tagSets": [] - }, - { - "route": "/Ad", - "downstreamCalls": {}, - "tagSets": [] - } - ], - "instances": [ - "adservice-6b654dbf57-zq8dt", - "adservice-d847fdcf5-j6s2f" - ], - "mergedTagSets": {}, - "random": { - "seed": 22694143111805, - "nextNextGaussian": 0, - "haveNextNextGaussian": false - } - } - ] - }, - "rootRoutes": [ - { - "service": "frontend", - "route": "/product", - "tracesPerHour": 2880 - }, - { - "service": "frontend", - "route": "/cart", - "tracesPerHour": 14400 - }, - { - "service": "frontend", - "route": "/shipping", - "tracesPerHour": 480 - }, - { - "service": "frontend", - "route": "/currency", - "tracesPerHour": 200 - }, - { - "service": "frontend", - "route": "/checkout", - "tracesPerHour": 480 - } - ] - } \ No newline at end of file diff --git a/example/docker-compose/grafana7.4/readme.md b/example/docker-compose/grafana7.4/readme.md deleted file mode 100644 index 860e211fbc8..00000000000 --- a/example/docker-compose/grafana7.4/readme.md +++ /dev/null @@ -1,61 +0,0 @@ -### Grafana 7.4.x -All of the other examples are designed to work with Grafana 7.5.x and forward. If you are using Grafana 7.4.x or before then you need -to use tempo-query along with Tempo for querying. This example shows all the configuration points necessary -to pull this off. - -1. First start up the stack. - -```console -docker-compose up -d -``` - -At this point, the following containers should be spun up - - -```console -docker-compose ps -``` -``` - Name Command State Ports -------------------------------------------------------------------------------------------------------------------------------------- -grafana74_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp -grafana74_prometheus_1 /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp -grafana74_synthetic-load-generator_1 ./start.sh Up -grafana74_tempo-query_1 /go/bin/query-linux --grpc ... Up 0.0.0.0:16686->16686/tcp -grafana74_tempo_1 /tempo -config.file=/etc/t ... Up 0.0.0.0:59541->14268/tcp, 0.0.0.0:59542->3200/tcp -``` - -2. If you're interested you can see the wal/blocks as they are being created. - -```console -ls tempo-data/ -``` - -3. The synthetic-load-generator is now printing out trace ids it's flushing into Tempo. To view its logs use - - -```console -docker-compose logs -f synthetic-load-generator -``` -``` -synthetic-load-generator_1 | 20/10/24 08:26:55 INFO ScheduledTraceGenerator: Emitted traceId 48367daf25266daa for service frontend route /currency -synthetic-load-generator_1 | 20/10/24 08:26:55 INFO ScheduledTraceGenerator: Emitted traceId 10e50d2aca58d5e7 for service frontend route /cart -synthetic-load-generator_1 | 20/10/24 08:26:55 INFO ScheduledTraceGenerator: Emitted traceId 51a4ac1638ee4c63 for service frontend route /shipping -synthetic-load-generator_1 | 20/10/24 08:26:55 INFO ScheduledTraceGenerator: Emitted traceId 1219370c6a796a6d for service frontend route /product -``` - -Logs are in the form - -``` -Emitted traceId for service frontend route /cart -``` - -Copy one of these trace ids. - -4. Navigate to [Grafana](http://localhost:3000/explore) and paste the trace id to request it from Tempo. - -> Note: This example uses the "Tempo-Query" datasource which is specially configured to look at tempo-query. - -5. To stop the setup use - - -```console -docker-compose down -v -``` diff --git a/example/docker-compose/grafana7.4/tempo-query.yaml b/example/docker-compose/grafana7.4/tempo-query.yaml deleted file mode 100644 index cd6ee1bf023..00000000000 --- a/example/docker-compose/grafana7.4/tempo-query.yaml +++ /dev/null @@ -1 +0,0 @@ -backend: "tempo:3200" \ No newline at end of file diff --git a/example/docker-compose/readme.md b/example/docker-compose/readme.md index 89fb2e6fb41..d243c6bf8d0 100644 --- a/example/docker-compose/readme.md +++ b/example/docker-compose/readme.md @@ -19,8 +19,6 @@ The following examples showcase specific features or integrations: Simple example using the OpenTelemetry Collector as a tracing pipeline. - [OpenTelemetry Collector Multitenant](otel-collector-multitenant/readme.md) Uses the OpenTelemetry Collector in an advanced multitenant configuration. -- [Grafana 7.4.x](grafana7.4/readme.md) - Uses tempo-query to allow for querying from Grafana 7.4 and before. These examples show off configuration of different storage backends: From d0aa034bff4defa6a82b447dc16f5609603ee27b Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:05:11 +0000 Subject: [PATCH 03/14] Drop docker-compose example for gcs --- .../docker-compose/gcs/docker-compose.yaml | 54 ------------------- example/docker-compose/gcs/readme.md | 37 ------------- example/docker-compose/gcs/tempo-gcs.yaml | 50 ----------------- example/docker-compose/readme.md | 1 - 4 files changed, 142 deletions(-) delete mode 100644 example/docker-compose/gcs/docker-compose.yaml delete mode 100644 example/docker-compose/gcs/readme.md delete mode 100644 example/docker-compose/gcs/tempo-gcs.yaml diff --git a/example/docker-compose/gcs/docker-compose.yaml b/example/docker-compose/gcs/docker-compose.yaml deleted file mode 100644 index 4e05dd39393..00000000000 --- a/example/docker-compose/gcs/docker-compose.yaml +++ /dev/null @@ -1,54 +0,0 @@ -version: "3" -services: - - tempo: - image: grafana/tempo:latest - command: [ "-config.file=/etc/tempo.yaml" ] - volumes: - - ./tempo-gcs.yaml:/etc/tempo.yaml - - ./tempo-data:/var/tempo - ports: - - "14268" # jaeger - - "3200:3200" # tempo - depends_on: - - gcs - - gcs: - image: fsouza/fake-gcs-server:latest - command: [ "-public-host=gcs -port=4443"] - ports: - - "4443:4443" - volumes: - # This creates an empty tempo bucket - - ./gcs-data/:/data/tempo/ - - k6-tracing: - image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 - environment: - - ENDPOINT=tempo:4317 - restart: always - depends_on: - - tempo - - prometheus: - image: prom/prometheus:latest - command: - - --config.file=/etc/prometheus.yaml - - --web.enable-remote-write-receiver - - --enable-feature=exemplar-storage - volumes: - - ../shared/prometheus.yaml:/etc/prometheus.yaml - ports: - - "9090:9090" - - grafana: - image: grafana/grafana:10.4.2 - volumes: - - ../shared/grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml - environment: - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_AUTH_DISABLE_LOGIN_FORM=true - - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor - ports: - - "3000:3000" diff --git a/example/docker-compose/gcs/readme.md b/example/docker-compose/gcs/readme.md deleted file mode 100644 index 53ef05cccb9..00000000000 --- a/example/docker-compose/gcs/readme.md +++ /dev/null @@ -1,37 +0,0 @@ -## GCS -In this example Tempo is configured to write data to GCS via [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) which presents a GCS compatible API. - -1. First start up the GCS stack. - -```console -docker-compose up -d -``` - -At this point, the following containers should be spun up - - -```console -docker-compose ps -``` -``` - Name Command State Ports --------------------------------------------------------------------------------------------------------- -gcs_gcs_1 /bin/fake-gcs-server -data ... Up 0.0.0.0:4443->4443/tcp,:::4443->4443/tcp -gcs_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp -gcs_k6-tracing_1 /k6-tracing run /example-s ... Up -gcs_prometheus_1 /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp -gcs_tempo_1 /tempo -config.file=/etc/t ... Up 0.0.0.0:32791->14268/tcp,:::32791->14268/tcp, - 0.0.0.0:3200->3200/tcp,:::3200->3200/tcp -``` - -2. If you're interested you can kind of see the wal/blocks as they are being created. Navigate to https://localhost:4443/storage/v1/b/tempo/o -to get a dump of all objects in the bucket. - -3. Navigate to [Grafana](http://localhost:3000/explore) select the Tempo data source and use the "Search" -tab to find traces. Also notice that you can query Tempo metrics from the Prometheus data source setup in -Grafana. - -4. To stop the setup use - - -```console -docker-compose down -v -``` diff --git a/example/docker-compose/gcs/tempo-gcs.yaml b/example/docker-compose/gcs/tempo-gcs.yaml deleted file mode 100644 index 751f63cebd6..00000000000 --- a/example/docker-compose/gcs/tempo-gcs.yaml +++ /dev/null @@ -1,50 +0,0 @@ -server: - http_listen_port: 3200 - -distributor: - receivers: # this configuration will listen on all ports and protocols that tempo is capable of. - jaeger: # the receives all come from the OpenTelemetry collector. more configuration information can - protocols: # be found there: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver - thrift_http: # - grpc: # for a production deployment you should only enable the receivers you need! - thrift_binary: - thrift_compact: - zipkin: - otlp: - protocols: - http: - grpc: - opencensus: - -ingester: - max_block_duration: 5m # cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally - -compactor: - compaction: - block_retention: 1h # overall Tempo trace retention. set for demo purposes - -metrics_generator: - registry: - external_labels: - source: tempo - cluster: docker-compose - storage: - path: /var/tempo/generator/wal - remote_write: - - url: http://prometheus:9090/api/v1/write - send_exemplars: true - -storage: - trace: - backend: gcs # backend configuration to use - wal: - path: /var/tempo/wal # where to store the the wal locally - gcs: - bucket_name: tempo - endpoint: https://gcs:4443/storage/v1/ - insecure: true - -overrides: - defaults: - metrics_generator: - processors: [service-graphs, span-metrics] diff --git a/example/docker-compose/readme.md b/example/docker-compose/readme.md index d243c6bf8d0..45c1082dd59 100644 --- a/example/docker-compose/readme.md +++ b/example/docker-compose/readme.md @@ -25,7 +25,6 @@ These examples show off configuration of different storage backends: - [Local Storage](local/readme.md) - [S3/Minio](s3/readme.md) - [Azure/Azurite](azure/readme.md) -- [GCS/Fake](gcs/readme.md) ### Build Images (Optional) From 4c374f2f5a442c089530355b388b0583fa8a3972 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:05:36 +0000 Subject: [PATCH 04/14] Drop docker-compose example for azure --- .../docker-compose/azure/docker-compose.yaml | 59 ------------------- example/docker-compose/azure/readme.md | 39 ------------ example/docker-compose/azure/tempo-azure.yaml | 51 ---------------- example/docker-compose/readme.md | 1 - 4 files changed, 150 deletions(-) delete mode 100644 example/docker-compose/azure/docker-compose.yaml delete mode 100644 example/docker-compose/azure/readme.md delete mode 100644 example/docker-compose/azure/tempo-azure.yaml diff --git a/example/docker-compose/azure/docker-compose.yaml b/example/docker-compose/azure/docker-compose.yaml deleted file mode 100644 index 9e74344d46d..00000000000 --- a/example/docker-compose/azure/docker-compose.yaml +++ /dev/null @@ -1,59 +0,0 @@ -version: "3" -services: - - tempo: - image: grafana/tempo:latest - command: [ "-config.file=/etc/tempo.yaml" ] - restart: always - volumes: - - ./tempo-azure.yaml:/etc/tempo.yaml - - ./tempo-data:/var/tempo - ports: - - "14268" # jaeger - - "3200:3200" # tempo - depends_on: - - azure-cli - - azurite - - azurite: - image: mcr.microsoft.com/azure-storage/azurite - ports: - - 10000:10000 - - # Creates the Azure storage container - azure-cli: - image: mcr.microsoft.com/azure-cli:2.9.1 - command: [ "az", "storage","container", "create", "-n","tempo", "--connection-string","DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1;" ] - depends_on: - - azurite - - k6-tracing: - image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 - environment: - - ENDPOINT=tempo:4317 - restart: always - depends_on: - - tempo - - prometheus: - image: prom/prometheus:latest - volumes: - - ../shared/prometheus.yaml:/etc/prometheus.yaml - command: - - --config.file=/etc/prometheus.yaml - - --web.enable-remote-write-receiver - - --enable-feature=exemplar-storage - ports: - - "9090:9090" - - grafana: - image: grafana/grafana:10.4.2 - volumes: - - ../shared/grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml - environment: - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_AUTH_DISABLE_LOGIN_FORM=true - - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor - ports: - - "3000:3000" diff --git a/example/docker-compose/azure/readme.md b/example/docker-compose/azure/readme.md deleted file mode 100644 index 26cfdf9b249..00000000000 --- a/example/docker-compose/azure/readme.md +++ /dev/null @@ -1,39 +0,0 @@ -## Azure -In this example tempo is configured to write data to Azure via [Azurite](https://github.com/Azure/Azurite) which presents an Azure compatible API. - -1. First start up the azure stack. - -```console -docker-compose up -d -``` - -At this point, the following containers should be spun up - - -```console -docker-compose ps -``` -``` - Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------- -azure_azure-cli_1 az storage container creat ... Exit 0 -azure_azurite_1 docker-entrypoint.sh azuri ... Up 0.0.0.0:10000->10000/tcp,:::10000->10000/tcp, 10001/tcp, - 10002/tcp -azure_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp -azure_k6-tracing_1 /k6-tracing run /example-s ... Up -azure_prometheus_1 /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp -azure_tempo_1 /tempo -config.file=/etc/t ... Up 0.0.0.0:32779->14268/tcp,:::32779->14268/tcp, - 0.0.0.0:3200->3200/tcp,:::3200->3200/tcp -``` - -2. If you're interested you can see the wal/blocks as they are being created. Check [Azure Storage Explorer](https://azure.microsoft.com/en-us/features/storage-explorer/) -and [Azurite docs](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azurite). - -3. Navigate to [Grafana](http://localhost:3000/explore) select the Tempo data source and use the "Search" -tab to find traces. Also notice that you can query Tempo metrics from the Prometheus data source setup in -Grafana. - -4. To stop the setup use - - -```console -docker-compose down -v -``` diff --git a/example/docker-compose/azure/tempo-azure.yaml b/example/docker-compose/azure/tempo-azure.yaml deleted file mode 100644 index 7b65821697d..00000000000 --- a/example/docker-compose/azure/tempo-azure.yaml +++ /dev/null @@ -1,51 +0,0 @@ -server: - http_listen_port: 3200 - -distributor: - receivers: # this configuration will listen on all ports and protocols that tempo is capable of. - jaeger: # the receives all come from the OpenTelemetry collector. more configuration information can - protocols: # be found there: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver - thrift_http: # - grpc: # for a production deployment you should only enable the receivers you need! - thrift_binary: - thrift_compact: - zipkin: - otlp: - protocols: - http: - grpc: - opencensus: - -ingester: - max_block_duration: 5m # cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally - -compactor: - compaction: - block_retention: 1h # overall Tempo trace retention. set for demo purposes - -metrics_generator: - registry: - external_labels: - source: tempo - cluster: docker-compose - storage: - path: /var/tempo/generator/wal - remote_write: - - url: http://prometheus:9090/api/v1/write - send_exemplars: true - -storage: - trace: - backend: azure # backend configuration to use - wal: - path: /var/tempo/wal # where to store the the wal locally - azure: - container_name: tempo # how to store data in azure - endpoint_suffix: azurite:10000 - storage_account_name: "devstoreaccount1" # Default Azurite storage account - storage_account_key: "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" # Default azurite sorage key - -overrides: - defaults: - metrics_generator: - processors: [service-graphs, span-metrics] \ No newline at end of file diff --git a/example/docker-compose/readme.md b/example/docker-compose/readme.md index 45c1082dd59..38c14044b87 100644 --- a/example/docker-compose/readme.md +++ b/example/docker-compose/readme.md @@ -24,7 +24,6 @@ These examples show off configuration of different storage backends: - [Local Storage](local/readme.md) - [S3/Minio](s3/readme.md) -- [Azure/Azurite](azure/readme.md) ### Build Images (Optional) From f62c28b1e5414bd57c845a772349b28eafa1c31b Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:06:01 +0000 Subject: [PATCH 05/14] Drop docker-compose example for s3 --- example/docker-compose/readme.md | 1 - example/docker-compose/s3/docker-compose.yaml | 58 ------------------- example/docker-compose/s3/readme.md | 38 ------------ example/docker-compose/s3/tempo-s3.yaml | 53 ----------------- 4 files changed, 150 deletions(-) delete mode 100644 example/docker-compose/s3/docker-compose.yaml delete mode 100644 example/docker-compose/s3/readme.md delete mode 100644 example/docker-compose/s3/tempo-s3.yaml diff --git a/example/docker-compose/readme.md b/example/docker-compose/readme.md index 38c14044b87..c651da86ff0 100644 --- a/example/docker-compose/readme.md +++ b/example/docker-compose/readme.md @@ -23,7 +23,6 @@ The following examples showcase specific features or integrations: These examples show off configuration of different storage backends: - [Local Storage](local/readme.md) -- [S3/Minio](s3/readme.md) ### Build Images (Optional) diff --git a/example/docker-compose/s3/docker-compose.yaml b/example/docker-compose/s3/docker-compose.yaml deleted file mode 100644 index fac43fb5cfa..00000000000 --- a/example/docker-compose/s3/docker-compose.yaml +++ /dev/null @@ -1,58 +0,0 @@ -version: "3" -services: - - tempo: - image: grafana/tempo:latest - command: [ "-config.file=/etc/tempo.yaml" ] - volumes: - - ./tempo-s3.yaml:/etc/tempo.yaml - - ./tempo-data:/var/tempo - ports: - - "14268" # jaeger - - "3200:3200" # tempo - restart: on-failure - depends_on: - - minio - - minio: - image: minio/minio:latest - environment: - - MINIO_ACCESS_KEY=tempo - - MINIO_SECRET_KEY=supersecret - ports: - - "9001:9001" - entrypoint: - - sh - - -euc - - mkdir -p /data/tempo && /opt/bin/minio server /data --console-address ':9001' - - k6-tracing: - image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 - environment: - - ENDPOINT=tempo:4317 - restart: always - depends_on: - - tempo - - prometheus: - image: prom/prometheus:latest - command: - - --config.file=/etc/prometheus.yaml - - --web.enable-remote-write-receiver - - --enable-feature=exemplar-storage - volumes: - - ../shared/prometheus.yaml:/etc/prometheus.yaml - ports: - - "9090:9090" - - grafana: - image: grafana/grafana:10.4.2 - volumes: - - ../shared/grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml - environment: - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_AUTH_DISABLE_LOGIN_FORM=true - - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor - ports: - - "3000:3000" diff --git a/example/docker-compose/s3/readme.md b/example/docker-compose/s3/readme.md deleted file mode 100644 index f68614671e0..00000000000 --- a/example/docker-compose/s3/readme.md +++ /dev/null @@ -1,38 +0,0 @@ -## S3 - -In this example tempo is configured to write data to S3 via MinIO which presents an S3 compatible API. - -1. First start up the S3 stack. - -```console -docker-compose up -d -``` - -At this point, the following containers should be spun up - - -```console -docker-compose ps -``` -``` - Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------- -s3_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp -s3_k6-tracing_1 /k6-tracing run /example-s ... Up -s3_minio_1 sh -euc mkdir -p /data/tem ... Up 9000/tcp, 0.0.0.0:9001->9001/tcp,:::9001->9001/tcp -s3_prometheus_1 /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp -s3_tempo_1 /tempo -config.file=/etc/t ... Up 0.0.0.0:32807->14268/tcp,:::32807->14268/tcp, - 0.0.0.0:3200->3200/tcp,:::3200->3200/tcp -``` - -2. If you're interested you can see the wal/blocks as they are being created. Navigate to minio at -http://localhost:9001 and use the username/password of `tempo`/`supersecret`. - -3. Navigate to [Grafana](http://localhost:3000/explore) select the Tempo data source and use the "Search" -tab to find traces. Also notice that you can query Tempo metrics from the Prometheus data source setup in -Grafana. - -4. To stop the setup use - - -```console -docker-compose down -v -``` diff --git a/example/docker-compose/s3/tempo-s3.yaml b/example/docker-compose/s3/tempo-s3.yaml deleted file mode 100644 index e5b22373160..00000000000 --- a/example/docker-compose/s3/tempo-s3.yaml +++ /dev/null @@ -1,53 +0,0 @@ -server: - http_listen_port: 3200 - -distributor: - receivers: # this configuration will listen on all ports and protocols that tempo is capable of. - jaeger: # the receives all come from the OpenTelemetry collector. more configuration information can - protocols: # be found there: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver - thrift_http: # - grpc: # for a production deployment you should only enable the receivers you need! - thrift_binary: - thrift_compact: - zipkin: - otlp: - protocols: - http: - grpc: - opencensus: - -ingester: - max_block_duration: 5m # cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally - -compactor: - compaction: - block_retention: 1h # overall Tempo trace retention. set for demo purposes - -metrics_generator: - registry: - external_labels: - source: tempo - cluster: docker-compose - storage: - path: /var/tempo/generator/wal - remote_write: - - url: http://prometheus:9090/api/v1/write - send_exemplars: true - -storage: - trace: - backend: s3 # backend configuration to use - wal: - path: /var/tempo/wal # where to store the the wal locally - s3: - bucket: tempo # how to store data in s3 - endpoint: minio:9000 - access_key: tempo - secret_key: supersecret - insecure: true - # For using AWS, select the appropriate regional endpoint and region - # endpoint: s3.dualstack.us-west-2.amazonaws.com - # region: us-west-2 - -overrides: - metrics_generator_processors: [service-graphs, span-metrics] From 87b1e6b2c459de86854264a6126b581cbe5a13ae Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:17:07 +0000 Subject: [PATCH 06/14] Update docker compose examples * Drop deprecated `version` field * Add init service to chown the volume on startup and set dependency for ordered startup * Use yaml reference for docker image specification --- .../docker-compose/agent/docker-compose.yaml | 42 ++++++++++++------- .../cross-cluster/docker-compose.yaml | 31 +++++++------- .../docker-compose/debug/docker-compose.yaml | 17 +++++++- .../distributed/docker-compose.yaml | 19 ++++----- .../docker-compose/local/docker-compose.yaml | 17 +++++++- .../multi-tenant/docker-compose.yaml | 20 +++++++-- .../docker-compose.yaml | 42 ++++++++++++------- .../otel-collector/docker-compose.yaml | 42 ++++++++++++------- .../docker-compose.yaml | 1 - 9 files changed, 152 insertions(+), 79 deletions(-) diff --git a/example/docker-compose/agent/docker-compose.yaml b/example/docker-compose/agent/docker-compose.yaml index 184ccd47f6d..94527a4e01e 100644 --- a/example/docker-compose/agent/docker-compose.yaml +++ b/example/docker-compose/agent/docker-compose.yaml @@ -1,6 +1,32 @@ -version: "3" services: + # Tempo runs as user 10001, and docker compose creates the volume as root. + # As such, we need to chown the volume in order for Tempo to start correctly. + init: + image: &tempoImage grafana/tempo:latest + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/var/tempo" + volumes: + - ./tempo-data:/var/tempo + + tempo: + image: *tempoImage + command: [ "-config.file=/etc/tempo.yaml" ] + volumes: + - ../shared/tempo.yaml:/etc/tempo.yaml + - ./tempo-data:/var/tempo + ports: + - "14268" # jaeger ingest + - "3200" # tempo + - "4317" # otlp grpc + - "4318" # otlp http + - "9411" # zipkin2024-04-23T16:16:57+0000 + depends_on: + - init + # Generate fake traces... k6-tracing: image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 @@ -19,20 +45,6 @@ services: - /bin/agent - -config.file=/etc/agent.yaml - # To eventually offload to Tempo... - tempo: - image: grafana/tempo:latest - command: [ "-config.file=/etc/tempo.yaml" ] - volumes: - - ../shared/tempo.yaml:/etc/tempo.yaml - - ./tempo-data:/var/tempo - ports: - - "14268" # jaeger ingest - - "3200" # tempo - - "4317" # otlp grpc - - "4318" # otlp http - - "9411" # zipkin - prometheus: image: prom/prometheus:latest command: diff --git a/example/docker-compose/cross-cluster/docker-compose.yaml b/example/docker-compose/cross-cluster/docker-compose.yaml index 323316c6ec1..37a66e607fc 100644 --- a/example/docker-compose/cross-cluster/docker-compose.yaml +++ b/example/docker-compose/cross-cluster/docker-compose.yaml @@ -1,9 +1,8 @@ -version: "3" services: # tempo - a distributor-a: - image: grafana/tempo:latest + image: &tempoImage grafana/tempo:latest command: "-target=distributor -config.file=/etc/tempo.yaml" restart: always volumes: @@ -12,7 +11,7 @@ services: - "3200" # tempo ingester-0-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -21,7 +20,7 @@ services: - "3200" # tempo ingester-1-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -30,7 +29,7 @@ services: - "3200" # tempo ingester-2-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -39,7 +38,7 @@ services: - "3200" # tempo query-frontend-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=query-frontend -config.file=/etc/tempo.yaml" restart: always volumes: @@ -48,7 +47,7 @@ services: - "3200" # tempo querier-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=querier -config.file=/etc/tempo.yaml" restart: always volumes: @@ -57,7 +56,7 @@ services: - "3200" # tempo compactor-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=compactor -config.file=/etc/tempo.yaml" restart: always volumes: @@ -66,7 +65,7 @@ services: - "3200" # tempo metrics-generator-a: - image: grafana/tempo:latest + image: *tempoImage command: "-target=metrics-generator -config.file=/etc/tempo.yaml" restart: always volumes: @@ -77,7 +76,7 @@ services: # tempo - b # there is purposefully no compactor-b. only one cell can compactor or there will be job collisions distributor-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=distributor -config.file=/etc/tempo.yaml" restart: always volumes: @@ -86,7 +85,7 @@ services: - "3200" # tempo ingester-0-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -95,7 +94,7 @@ services: - "3200" # tempo ingester-1-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -104,7 +103,7 @@ services: - "3200" # tempo ingester-2-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -113,7 +112,7 @@ services: - "3200" # tempo query-frontend-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=query-frontend -config.file=/etc/tempo.yaml" restart: always volumes: @@ -122,7 +121,7 @@ services: - "3200" # tempo querier-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=querier -config.file=/etc/tempo.yaml" restart: always volumes: @@ -131,7 +130,7 @@ services: - "3200" # tempo metrics-generator-b: - image: grafana/tempo:latest + image: *tempoImage command: "-target=metrics-generator -config.file=/etc/tempo.yaml" restart: always volumes: diff --git a/example/docker-compose/debug/docker-compose.yaml b/example/docker-compose/debug/docker-compose.yaml index fa2e05f0620..b4a0bd3b8bd 100644 --- a/example/docker-compose/debug/docker-compose.yaml +++ b/example/docker-compose/debug/docker-compose.yaml @@ -1,8 +1,19 @@ -version: "3" services: + # Tempo runs as user 10001, and docker compose creates the volume as root. + # As such, we need to chown the volume in order for Tempo to start correctly. + init: + image: &tempoImage grafana/tempo-debug:latest + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/var/tempo" + volumes: + - ./tempo-data:/var/tempo + tempo: - image: grafana/tempo-debug:latest + image: *tempoImage command: [ "-config.file=/etc/tempo.yaml" ] volumes: - ../shared/tempo.yaml:/etc/tempo.yaml @@ -16,6 +27,8 @@ services: - "4318:4318" # otlp http - "9411:9411" # zipkin - "2345:2345" # delve debug server + depends_on: + - init k6-tracing: image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 diff --git a/example/docker-compose/distributed/docker-compose.yaml b/example/docker-compose/distributed/docker-compose.yaml index a74239cd6a4..364f06347ed 100644 --- a/example/docker-compose/distributed/docker-compose.yaml +++ b/example/docker-compose/distributed/docker-compose.yaml @@ -1,8 +1,7 @@ -version: "3" services: distributor: - image: grafana/tempo:latest + image: &tempoImage grafana/tempo:latest command: "-target=distributor -config.file=/etc/tempo.yaml" restart: always volumes: @@ -16,7 +15,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 ingester-0: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -30,7 +29,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 ingester-1: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -44,7 +43,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 ingester-2: - image: grafana/tempo:latest + image: *tempoImage command: "-target=ingester -config.file=/etc/tempo.yaml" restart: always volumes: @@ -58,7 +57,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 query-frontend: - image: grafana/tempo:latest + image: *tempoImage command: "-target=query-frontend -config.file=/etc/tempo.yaml -log.level=debug" restart: always volumes: @@ -72,7 +71,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 querier: - image: grafana/tempo:latest + image: *tempoImage command: "-target=querier -config.file=/etc/tempo.yaml -log.level=debug" restart: always volumes: @@ -86,7 +85,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 compactor: - image: grafana/tempo:latest + image: *tempoImage command: "-target=compactor -config.file=/etc/tempo.yaml" restart: always volumes: @@ -100,7 +99,7 @@ services: # - JAEGER_SAMPLER_PARAM=1 metrics-generator: - image: grafana/tempo:latest + image: *tempoImage command: "-target=metrics-generator -config.file=/etc/tempo.yaml" restart: always volumes: @@ -170,4 +169,4 @@ services: - -euc - /bin/grafana-agent run --server.http.listen-addr=0.0.0.0:12345 /etc/agent.river ports: - - "12345:12345" \ No newline at end of file + - "12345:12345" diff --git a/example/docker-compose/local/docker-compose.yaml b/example/docker-compose/local/docker-compose.yaml index 970bc22b028..e6d697051e8 100644 --- a/example/docker-compose/local/docker-compose.yaml +++ b/example/docker-compose/local/docker-compose.yaml @@ -1,8 +1,19 @@ -version: "3" services: + # Tempo runs as user 10001, and docker compose creates the volume as root. + # As such, we need to chown the volume in order for Tempo to start correctly. + init: + image: &tempoImage grafana/tempo:latest + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/var/tempo" + volumes: + - ./tempo-data:/var/tempo + tempo: - image: grafana/tempo:latest + image: *tempoImage command: [ "-config.file=/etc/tempo.yaml" ] volumes: - ../shared/tempo.yaml:/etc/tempo.yaml @@ -14,6 +25,8 @@ services: - "4317:4317" # otlp grpc - "4318:4318" # otlp http - "9411:9411" # zipkin + depends_on: + - init k6-tracing: image: ghcr.io/grafana/xk6-client-tracing:latest diff --git a/example/docker-compose/multi-tenant/docker-compose.yaml b/example/docker-compose/multi-tenant/docker-compose.yaml index 8f01b4940cd..90404afa50c 100644 --- a/example/docker-compose/multi-tenant/docker-compose.yaml +++ b/example/docker-compose/multi-tenant/docker-compose.yaml @@ -1,10 +1,22 @@ -version: "3" services: + + # Tempo runs as user 10001, and docker compose creates the volume as root. + # As such, we need to chown the volume in order for Tempo to start correctly. + init: + image: &tempoImage grafana/tempo:latest + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/var/tempo" + volumes: + - ./tempo-data:/var/tempo + tempo: - image: grafana/tempo:latest + image: *tempoImage + command: [ "-config.file=/etc/tempo.yaml" ] environment: - GRPC_TRACE=api - command: [ "-config.file=/etc/tempo.yaml" ] volumes: - ./tempo.yaml:/etc/tempo.yaml - ./tempo-data:/var/tempo @@ -15,6 +27,8 @@ services: - "4317:4317" # otlp grpc - "4318:4318" # otlp http - "9411:9411" # zipkin + depends_on: + - init k6-tracing: image: ghcr.io/grafana/xk6-client-tracing:latest diff --git a/example/docker-compose/otel-collector-multitenant/docker-compose.yaml b/example/docker-compose/otel-collector-multitenant/docker-compose.yaml index 1b0f81460ae..8d59984c824 100644 --- a/example/docker-compose/otel-collector-multitenant/docker-compose.yaml +++ b/example/docker-compose/otel-collector-multitenant/docker-compose.yaml @@ -1,6 +1,32 @@ -version: "3" services: + # Tempo runs as user 10001, and docker compose creates the volume as root. + # As such, we need to chown the volume in order for Tempo to start correctly. + init: + image: &tempoImage grafana/tempo:latest + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/var/tempo" + volumes: + - ./tempo-data:/var/tempo + + tempo: + image: *tempoImage + command: [ "-multitenancy.enabled=true", "-config.file=/etc/tempo.yaml" ] + volumes: + - ../shared/tempo.yaml:/etc/tempo.yaml + - ./tempo-data:/var/tempo + ports: + - "14268" # jaeger ingest + - "3200" # tempo + - "4317" # otlp grpc + - "4318" # otlp http + - "9411" # zipkin + depends_on: + - init + # Generate fake traces... k6-tracing: image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 @@ -17,20 +43,6 @@ services: volumes: - ./otel-collector.multitenant.yaml:/etc/otel-collector.yaml - # To eventually offload to Tempo... - tempo: - image: grafana/tempo:latest - command: [ "-multitenancy.enabled=true", "-config.file=/etc/tempo.yaml" ] - volumes: - - ../shared/tempo.yaml:/etc/tempo.yaml - - ./tempo-data:/var/tempo - ports: - - "14268" # jaeger ingest - - "3200" # tempo - - "4317" # otlp grpc - - "4318" # otlp http - - "9411" # zipkin - prometheus: image: prom/prometheus:latest command: diff --git a/example/docker-compose/otel-collector/docker-compose.yaml b/example/docker-compose/otel-collector/docker-compose.yaml index 80ad8e76754..6235eb833aa 100644 --- a/example/docker-compose/otel-collector/docker-compose.yaml +++ b/example/docker-compose/otel-collector/docker-compose.yaml @@ -1,6 +1,32 @@ -version: "3" services: + # Tempo runs as user 10001, and docker compose creates the volume as root. + # As such, we need to chown the volume in order for Tempo to start correctly. + init: + image: &tempoImage grafana/tempo:latest + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/var/tempo" + volumes: + - ./tempo-data:/var/tempo + + tempo: + image: *tempoImage + command: [ "-config.file=/etc/tempo.yaml" ] + volumes: + - ../shared/tempo.yaml:/etc/tempo.yaml + - ./tempo-data:/var/tempo + ports: + - "14268" # jaeger ingest + - "3200" # tempo + - "4317" # otlp grpc + - "4318" # otlp http + - "9411" # zipkin + depends_on: + - init + # Generate fake traces... k6-tracing: image: ghcr.io/grafana/xk6-client-tracing:v0.0.2 @@ -17,20 +43,6 @@ services: volumes: - ./otel-collector.yaml:/etc/otel-collector.yaml - # To eventually offload to Tempo... - tempo: - image: grafana/tempo:latest - command: [ "-config.file=/etc/tempo.yaml" ] - volumes: - - ../shared/tempo.yaml:/etc/tempo.yaml - - ./tempo-data:/var/tempo - ports: - - "14268" # jaeger ingest - - "3200" # tempo - - "4317" # otlp grpc - - "4318" # otlp http - - "9411" # zipkin - prometheus: image: prom/prometheus:latest command: diff --git a/example/docker-compose/scalable-single-binary/docker-compose.yaml b/example/docker-compose/scalable-single-binary/docker-compose.yaml index 0c89ad41c53..e9a39c279db 100644 --- a/example/docker-compose/scalable-single-binary/docker-compose.yaml +++ b/example/docker-compose/scalable-single-binary/docker-compose.yaml @@ -1,4 +1,3 @@ -version: "3" services: tempo1: From 544a3ee03195979c60cf37d11b182448e7da9e99 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:20:47 +0000 Subject: [PATCH 07/14] Update docker compose example commands for deprecation --- example/docker-compose/agent/readme.md | 6 +++--- example/docker-compose/debug/readme.md | 8 ++++---- example/docker-compose/distributed/readme.md | 6 +++--- example/docker-compose/local/readme.md | 6 +++--- example/docker-compose/multi-tenant/readme.md | 6 +++--- .../docker-compose/otel-collector-multitenant/readme.md | 6 +++--- example/docker-compose/otel-collector/readme.md | 6 +++--- example/docker-compose/scalable-single-binary/readme.md | 6 +++--- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/example/docker-compose/agent/readme.md b/example/docker-compose/agent/readme.md index ceecd33f45c..b4474412b69 100644 --- a/example/docker-compose/agent/readme.md +++ b/example/docker-compose/agent/readme.md @@ -4,13 +4,13 @@ This example highlights setting up the Grafana Agent in a simple tracing pipelin 1. First start up the stack. ```console -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be spun up - ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -37,5 +37,5 @@ tab to find traces. 4. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` diff --git a/example/docker-compose/debug/readme.md b/example/docker-compose/debug/readme.md index 1ec5501b5fd..5bb679b8b65 100644 --- a/example/docker-compose/debug/readme.md +++ b/example/docker-compose/debug/readme.md @@ -5,7 +5,7 @@ questions about the general setup, please refer to its readme file. Although it's possible to debug Tempo with [`dlv debug`](https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_debug.md), this approach also has disadvantages in scenarios where it is desirable to run Tempo inside a container. -This example demonstrates how to debug Tempo running in docker-compose. +This example demonstrates how to debug Tempo running in docker compose. The make target `docker-tempo-debug` compiles tempo without optimizations and creates a docker image that runs Tempo using [`dlv exec`](https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_exec.md). @@ -32,13 +32,13 @@ Setting this option to `1` is helpful to debug errors during the start-up phase. 3. Now, start up the stack from this directory. ```console -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be running: ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -69,5 +69,5 @@ configuration: 5. To stop the setup, use: ```console -docker-compose down -v +docker compose down -v ``` diff --git a/example/docker-compose/distributed/readme.md b/example/docker-compose/distributed/readme.md index 8a5cd2c8e9c..5489496e1b2 100644 --- a/example/docker-compose/distributed/readme.md +++ b/example/docker-compose/distributed/readme.md @@ -7,13 +7,13 @@ which presents an S3 compatible API. 1. First start up the distributed stack. ```console -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be spun up - ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -41,5 +41,5 @@ tab to find traces. 4. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` diff --git a/example/docker-compose/local/readme.md b/example/docker-compose/local/readme.md index 0cb1d75fd7d..4418ce45a83 100644 --- a/example/docker-compose/local/readme.md +++ b/example/docker-compose/local/readme.md @@ -11,13 +11,13 @@ permissions set in order to start correctly. ```console mkdir tempo-data/ sudo chown 10001:10001 tempo-data/ -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be spun up - ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -50,7 +50,7 @@ docker logs local_tempo_1 -f 5. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` ## search streaming over http diff --git a/example/docker-compose/multi-tenant/readme.md b/example/docker-compose/multi-tenant/readme.md index 0d0b7755472..da33de86217 100644 --- a/example/docker-compose/multi-tenant/readme.md +++ b/example/docker-compose/multi-tenant/readme.md @@ -5,7 +5,7 @@ or when using the single binary, but does not work in a distributed/microservice 1. First start up the local stack. ```console -$ docker-compose up -d +$ docker compose up -d Starting multi-tenant_grafana_1 ... done Starting multi-tenant_tempo_1 ... done Starting multi-tenant_k6-tracing-2_1 ... done @@ -15,7 +15,7 @@ Starting multi-tenant_k6-tracing_1 ... done At this point, the following containers should be spun up - ```console -$ docker-compose ps +$ docker compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------------------------------ multi-tenant_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp @@ -45,7 +45,7 @@ $ docker logs multi-tenant_tempo_1 -f 5. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` ## streaming and multi-tenant search diff --git a/example/docker-compose/otel-collector-multitenant/readme.md b/example/docker-compose/otel-collector-multitenant/readme.md index 83478029be8..35df98c7d80 100644 --- a/example/docker-compose/otel-collector-multitenant/readme.md +++ b/example/docker-compose/otel-collector-multitenant/readme.md @@ -4,13 +4,13 @@ This example highlights setting up the OpenTelemetry Collector in a multitenant 1. First start up the stack. ```console -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be spun up - ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -38,5 +38,5 @@ Grafana. 4. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` diff --git a/example/docker-compose/otel-collector/readme.md b/example/docker-compose/otel-collector/readme.md index 868817267ec..4e307f4f833 100644 --- a/example/docker-compose/otel-collector/readme.md +++ b/example/docker-compose/otel-collector/readme.md @@ -4,13 +4,13 @@ This example highlights setting up the OpenTelemetry Collector in a simple traci 1. First start up the stack. ```console -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be spun up - ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -39,5 +39,5 @@ Grafana. 4. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` diff --git a/example/docker-compose/scalable-single-binary/readme.md b/example/docker-compose/scalable-single-binary/readme.md index 94d7692bc19..3e41e262ffd 100644 --- a/example/docker-compose/scalable-single-binary/readme.md +++ b/example/docker-compose/scalable-single-binary/readme.md @@ -10,13 +10,13 @@ that `memberlist` provides. 1. First start up the local stack. ```console -docker-compose up -d +docker compose up -d ``` At this point, the following containers should be spun up - ```console -docker-compose ps +docker compose ps ``` ``` Name Command State Ports @@ -42,5 +42,5 @@ Grafana. 4. To stop the setup use - ```console -docker-compose down -v +docker compose down -v ``` From a147a946a1e0f11f410563a3cb02be4fe367f69d Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:22:48 +0000 Subject: [PATCH 08/14] Update top docker-compose readme to point to our docs --- example/docker-compose/readme.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/example/docker-compose/readme.md b/example/docker-compose/readme.md index c651da86ff0..7e9496b8fb0 100644 --- a/example/docker-compose/readme.md +++ b/example/docker-compose/readme.md @@ -1,7 +1,10 @@ ## Docker-compose -So you found your way to the docker-compose examples? This is a great place to get started with Tempo, learn -some basic configuration and learn about various trace discovery flows. +So you found your way to the docker compose examples? This is a great place to +get started with Tempo, learn some basic configuration and learn about various +trace discovery flows. + +See our [getting-started](https://grafana.com/docs/tempo/next/getting-started/docker-example/) docs for more detail. If you are interested in more complex configuration we would recommend the [tanka/jsonnet examples](../tk/readme.md). @@ -20,17 +23,17 @@ The following examples showcase specific features or integrations: - [OpenTelemetry Collector Multitenant](otel-collector-multitenant/readme.md) Uses the OpenTelemetry Collector in an advanced multitenant configuration. -These examples show off configuration of different storage backends: +This example uses the `local` backend, suitable for local testing and development: - [Local Storage](local/readme.md) ### Build Images (Optional) This step is not necessary, but it can be nice for local testing. For any of the above examples rebuilding these -images will cause docker-compose to use your local code when running the examples. +images will cause docker compose to use your local code when running the examples. -Run the following from the project root folder to build the`grafana/tempo:latest` image that is used in all the examples: +Run the following from the project root folder to build the `grafana/tempo:latest` image that is used in all the examples: ```console make docker-images -``` \ No newline at end of file +``` From c5a67a980f888e203e8394be7d468befc263a3d7 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:23:29 +0000 Subject: [PATCH 09/14] Update integration readme for docker compose command deprecation --- integration/microservices/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration/microservices/README.md b/integration/microservices/README.md index 2cb60b4bc98..ab8026fe1fd 100644 --- a/integration/microservices/README.md +++ b/integration/microservices/README.md @@ -30,10 +30,10 @@ copy of tempo already cloned somewhere. 1. Build the tempo container 1. Run `make docker-tempo` 1. This tags a local image `tempo:latest` -1. Run this repo with docker-compose - 1. `docker-compose up -d` +1. Run this repo with `docker compose` + 1. `docker compose up -d` 1. Browse to dashboard at http://localhost:3000/d/iaJI4FxMk/tempo-benchmarking - 1. When finished run `docker-compose down` + 1. When finished run `docker compose down` _Repeat steps 1-2 to see how code changes affect performance._ From d1de0c645a038c9085eef6a2112853b58920c7f2 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:24:00 +0000 Subject: [PATCH 10/14] Update tk readme for docker compose command deprecation --- example/tk/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/tk/readme.md b/example/tk/readme.md index eb69586955c..549ab0841bb 100644 --- a/example/tk/readme.md +++ b/example/tk/readme.md @@ -2,7 +2,7 @@ Congratulations! You have successfully found the jsonnet/tanka examples. These examples are meant for advanced users looking to deploy Tempo in a microservices pattern. If you are just getting started -might I recommend the [docker-compose examples](../docker-compose). The docker-compose examples also are much +might I recommend the [docker compose examples](../docker-compose). The docker compose examples also are much better at demonstrating trace discovery flows using Loki and other tools. If you're convinced this is the place for you then keep reading! From b6164ba0e4fc906fa762423fcc359a50cce4b68f Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:24:32 +0000 Subject: [PATCH 11/14] Remove s3 docker compose example and point to the top of the example/docker-compose --- docs/sources/tempo/setup/deployment.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/sources/tempo/setup/deployment.md b/docs/sources/tempo/setup/deployment.md index 3ad6d2111b8..7d7df00a2e5 100644 --- a/docs/sources/tempo/setup/deployment.md +++ b/docs/sources/tempo/setup/deployment.md @@ -33,8 +33,7 @@ To enable this mode, `-target=all` is used, which is the default. Find docker-compose deployment examples at: -- [https://github.com/grafana/tempo/tree/main/example/docker-compose/local](https://github.com/grafana/tempo/tree/main/example/docker-compose/local) -- [https://github.com/grafana/tempo/tree/main/example/docker-compose/s3](https://github.com/grafana/tempo/tree/main/example/docker-compose/s3) +- [https://github.com/grafana/tempo/tree/main/example/docker-compose](https://github.com/grafana/tempo/tree/main/example/docker-compose/) ### Scaling monolithic mode From e55de0d8ce8819830bd481a85127f8fa57c704d0 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:28:20 +0000 Subject: [PATCH 12/14] Update wording slightly --- docs/sources/tempo/getting-started/docker-example.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/sources/tempo/getting-started/docker-example.md b/docs/sources/tempo/getting-started/docker-example.md index cd293ecb45c..61b6734f2ff 100644 --- a/docs/sources/tempo/getting-started/docker-example.md +++ b/docs/sources/tempo/getting-started/docker-example.md @@ -10,7 +10,8 @@ weight: 600 The Tempo repository provides [multiple examples](https://github.com/grafana/tempo/tree/main/example/docker-compose) to help you quickly get started using Tempo and distributed tracing data. Every example has a `docker-compose.yaml` manifest that includes all of the options needed to explore trace data in Grafana, including resource configuration and trace data generation. -The Tempo examples running with Docker using docker-compose all include a version of Tempo and a storage configuration like Amazon S3 and GCS. + +The Tempo examples running with Docker using docker-compose include a version of Tempo and a storage configuration like Amazon S3 and GCS. This quick start guide uses the `local` example running Tempo as a single binary (monolithic). Any data is stored locally in the `tempo-data` folder. To learn more, read the [local storage example README](https://github.com/grafana/tempo/blob/main/example/docker-compose/local). From 72b39d4e9094ddce06f46aa4f3f3e3b9dc154b99 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Tue, 23 Apr 2024 18:32:49 +0000 Subject: [PATCH 13/14] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7226f7d85fd..ee36fb74765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This impacts impacts all users of the `grafana/tempo` Docker image. * [CHANGE] Return a less confusing error message to the client when refusing spans due to ingestion rates. [#3485](https://github.com/grafana/tempo/pull/3485) (@ie-pham) * [CHANGE] Clean Metrics Generator's Prometheus wal before creating instance [#3548](https://github.com/grafana/tempo/pull/3548) (@ie-pham) +* [CHANGE] Update docker examples for permissions, deprecations, and clean-up [#3603](https://github.com/grafana/tempo/pull/3603) (@zalegrala) * [ENHANCEMENT] Add string interning to TraceQL queries [#3411](https://github.com/grafana/tempo/pull/3411) (@mapno) * [ENHANCEMENT] Add new (unsafe) query hints for metrics queries [#3396](https://github.com/grafana/tempo/pull/3396) (@mdisibio) * [ENHANCEMENT] Add nestedSetLeft/Right/Parent instrinsics to TraceQL. [#3497](https://github.com/grafana/tempo/pull/3497) (@joe-elliott) From cdd03257405f292f672882a5d7b5434d7d3c2fe7 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Wed, 24 Apr 2024 13:26:30 +0000 Subject: [PATCH 14/14] Be less specific about the possible backend configurations. --- docs/sources/tempo/getting-started/docker-example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/tempo/getting-started/docker-example.md b/docs/sources/tempo/getting-started/docker-example.md index 61b6734f2ff..2c6dc5ff18e 100644 --- a/docs/sources/tempo/getting-started/docker-example.md +++ b/docs/sources/tempo/getting-started/docker-example.md @@ -11,7 +11,7 @@ The Tempo repository provides [multiple examples](https://github.com/grafana/tem Every example has a `docker-compose.yaml` manifest that includes all of the options needed to explore trace data in Grafana, including resource configuration and trace data generation. -The Tempo examples running with Docker using docker-compose include a version of Tempo and a storage configuration like Amazon S3 and GCS. +The Tempo examples running with Docker using docker-compose include a version of Tempo and a storage configuration suitable for testing or development. This quick start guide uses the `local` example running Tempo as a single binary (monolithic). Any data is stored locally in the `tempo-data` folder. To learn more, read the [local storage example README](https://github.com/grafana/tempo/blob/main/example/docker-compose/local).