构建可观测性平台
如果要构建一个可观测的平台,我们需要根据opentelemetry的标准进行日志收集,同时根据opentelemetry的标准,可观测性分为tracing,logging和metric,需要同时支持这三种可观测性的平台有很多:如AWS,Azure,BugSnag,Sentry,Datadog,Signoz,Uptrace,Elastic 等等,本文将以Elastic为例,构建一个可观测平台。
构建可观测性平台的要素
opentelemetry 规范了日志导入导出和可视化的规范,具体架构请看下图:
可以看到,opentelemetry通过收集器收集日志数据,并可以导出到各个观测平台。
- 收集器: opentelemetry官方提供了一个收集器(),可以通过yaml文件配置收集器的导入导出
- 可视化界面 Opentelemetry并没有提供官方可视化工具,有很多厂商提供了自家的可视化平台,今天我们将用到Elastic到Kibana
- 持续化存储方案 收集器可以将日志导出到特定的数据库,但是目前比较流行的日志分析数据库是elasticsearch和clickhouse,因为他们性能会更好
- SDK Opentelemetry官方提供了各个客户端日志上报的SDK和API,方便用户快速集成
Elastic的可观测性架构
客户端通过APM Agent SDK将日志采集并发送到APM Server,APM Server再将日志发送到Elasticsearch(默认elasticsearch,可以自行配置其他持久化存储),最后通过Kibana到可视化查询日志
搭建Elastic可视化平台
- 安装Elasticsearch:‣
- 安装Kibana:‣
- 安装APM Server:‣
一个简单的nodejs代码测试
- 安装依赖
npm install elastic-apm-node
- nodejs 代码
import { createServer } from 'node:http'; import apm from 'elastic-apm-node' apm.start({ serviceName: 'my-nodejs-service', // 服务名称,在 Kibana 中显示 serverUrl: 'http://localhost:8200', // APM Server 地址 environment: 'production', // 环境名称,可以是 'development', 'production' 等 secretToken: '', // 如果 APM Server 使用了 secret token 进行身份验证 captureBody: 'all', // 捕获请求体 active: true // 启用 APM 代理 }); const server = createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World!\n'); }); // starts a simple http server locally on port 3000 server.listen(3000, '127.0.0.1', () => { console.log('Listening on 127.0.0.1:3000'); });
- 通过浏览器查看elasticsearch中有没有apm相关的index
https://localhost:9200/_cat/indices?v