前面我们介绍了 Grafana 开源了一个权限的分布式追踪系统 Tempo,虽然现在项目还在初期阶段,文档也不是很健全,但是 Grafana 描述的一站式分布式追踪平台还是非常有吸引力的。这里面我们用一个简单的示例来了解下 Grafana 是如何整合可观测性工具的。
首先我们要安装 Loki 的 Docker 驱动,这样可以将 docker-compose 中的应用程序日志发送到 Loki。
$ docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
latest: Pulling from grafana/loki-docker-driver
e497c57a86bd: Download complete
Digest: sha256:332ae553f11a08c379ae7fff95da1700818272fbb1c32aaf60eefea9bf5123e1
Status: Downloaded newer image for grafana/loki-docker-driver:latest
Installed plugin grafana/loki-docker-driver:latest
$ docker plugin ls
ID NAME DESCRIPTION ENABLED
c89eab5ba164 loki:latest Loki Logging Driver true
接下来克隆 tempo 的代码,进入到 examples 目录下面,该目录下面有很多测试样例:
$ git clone https://github.com/grafana/tempo.git
$ cd tempo/example/docker-compose
为了快速测试,这里我们使用 docker-compose 的方式来启动 Loki stack 的相关应用,启动的资源清单文件如下所示:
version: "2"
services:
tempo:
image: grafana/tempo:latest
command:
- "-storage.trace.backend=local" # 告诉 tempo 使用本地存储存放 traces 数据
- "-storage.trace.local.path=/tmp/tempo/traces"
- "-storage.trace.wal.path=/tmp/tempo/wal" # 存放 wal 路径
- "-auth.enabled=false" # disables the requirement for the X-Scope-OrgID header
- "-server.http-listen-port=3100"
volumes:
- ./tempo.yaml:/etc/tempo.yaml
- /tmp/tempo:/tmp/tempo
ports:
- "14268" # jaeger ingest
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
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
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yaml:/etc/prometheus.yaml
entrypoint:
- /bin/prometheus
- --config.file=/etc/prometheus.yaml
ports:
- "9090:9090"
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
grafana:
image: grafana/grafana:7.3.0-beta1
volumes:
- ./datasources:/etc/grafana/provisioning/datasources
- ./dashboards-provisioning:/etc/grafana/provisioning/dashboards
- ../../operations/tempo-mixin/out:/var/lib/grafana/dashboards
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
ports:
- "3000:3000"
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
loki:
image: grafana/loki:1.6.1
command: -config.file=/etc/loki/local-config.yaml
ports:
- "3100:3100" # loki needs to be exposed so it receives logs
environment:
- JAEGER_AGENT_HOST=tempo
- JAEGER_ENDPOINT=http://tempo:14268/api/traces # send traces to Tempo
- JAEGER_SAMPLER_TYPE=const
- JAEGER_SAMPLER_PARAM=1
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
整个资源清单文件中我们配置了 tempo、prometheus、grafana、loki 几个应用,tempo 支持 local、S3 或者 GCS 后端存储,examples 目录下面都有对应的测试文件,这里我们可以看到 tempo 使用的是 local 本地存储,直接使用下面的命令启动即可:
$ docker-compose -f docker-compose.loki.yaml up -d
......
Creating docker-compose_loki_1 ... done
Creating docker-compose_tempo-query_1 ... done
Creating docker-compose_grafana_1 ... done
Creating docker-compose_prometheus_1 ... done
Creating docker-compose_tempo_1 ... done
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------
docker-compose_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp
docker-compose_prometheus_1 /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
docker-compose_tempo-query_1 /go/bin/query-linux --grpc ... Up 0.0.0.0:16686->16686/tcp
docker-compose_tempo_1 /tempo -storage.trace.back ... Up 0.0.0.0:32768->14268/tcp
启动完成后我们可以在浏览器中打开 Grafana,在 Loki 中使用命令 {container_name="docker-compose_loki_1"}
查询几次,这样可以生成一些 traces 数据。
接下来让我们来执行一个专门查询一些 trace ids 的查询,在操作的时候通常会使用 Loki 来搜索类似于查询路径或状态码之类的数据,这里我们只是简单演示,使用命令 {container_name="docker-compose_loki_1"} |= "traceID"
查询即可。
然后我们展开某条日志数据,在属性列表中找到 TraceID。
点击后面的 Tempo 链接,我们就可以直接从日志跳转到 Trace 页面去了!
默认情况下会分屏显示 Loki 日志和 Trace 信息,在右侧就是 Tempo 为我们展示的该 TraceID 的相关跟踪信息,这样我们也完全可以根据我们的追踪信息来了解某次请求的具体情况了。
除了日志和 Trace 数据外,我们还可以直接在 Grafana 里面查询 Prometheus 的监控指标数据。
整个应用的可观测性日志、Trace、监控都完美的集成到了 Grafana 中来,形成了一站式可观测性平台,而且这些数据之间还可以进行联动,大大提高了我们观测应用的效率,这才是观测该有的样子吧,所以你还在以为 Grafana 只是一个图表工具吗?