基于Node.js+Skywalking按API Key拆分的端点统计仪表盘构建咨询
按API Key拆分端点使用统计的实现方案
1. 在Node.js服务中注入API Key到Skywalking追踪
在你的Node.js应用里,利用Skywalking Node.js SDK的自定义标签功能,在请求入口处提取x-api-key并关联到追踪链路:
const agent = require('skywalking-nodejs'); const express = require('express'); const app = express(); // 初始化Skywalking agent(按现有配置调整参数) agent.start({ serviceName: 'your-service-name', collectorAddress: 'your-skywalking-oap:11800', }); // 添加请求拦截中间件,注入API Key标签 app.use((req, res, next) => { const apiKey = req.headers['x-api-key']; if (apiKey) { // 将API Key设为Skywalking追踪的自定义标签 agent.setCustomTag('x-api-key', apiKey); } next(); }); // 业务路由示例 app.get('/some-endpoint', (req, res) => { res.send('OK'); }); app.listen(3000);
2. 配置Skywalking OAP存储自定义标签
修改Skywalking OAP Server的application.yml,确保自定义标签x-api-key被纳入追踪数据的存储维度(以Elasticsearch存储为例,其他存储类型配置逻辑类似):
core: default: traceSegmentStorage: elasticsearch: customTags: - key: x-api-key value: string
重启OAP Server使配置生效。
3. 统计数据查询
方式一:通过Skywalking查询API获取
调用Skywalking的Metrics查询接口,按endpoint和x-api-key维度聚合请求数:
# 替换你的OAP地址、服务ID等参数 curl "http://your-skywalking-oap:12800/graphql" -H "Content-Type: application/json" -d '{ "query": "query queryEndpointMetrics($serviceId: ID!, $duration: Duration!) { endpointMetrics( serviceId: $serviceId, duration: $duration, metrics: [\"endpoint_cpm\"], groupBy: [\"endpoint\", \"x-api-key\"] ) { values { labels { endpoint, x-api-key } value } } }", "variables": { "serviceId": "your-service-id", "duration": { "start": "2024-05-01 00:00:00", "end": "2024-05-01 23:59:59", "step": "HOUR" } } }'
方式二:从Postgres直接查询(若请求日志落地到PG)
如果应用已将请求日志(包含endpoint、api_key字段)写入Postgres,直接执行SQL统计:
SELECT endpoint, api_key, COUNT(*) AS request_count FROM request_logs WHERE request_time BETWEEN '2024-05-01 00:00:00' AND '2024-05-01 23:59:59' GROUP BY endpoint, api_key ORDER BY request_count DESC;
4. 仪表盘展示
- Skywalking自带仪表盘:进入Skywalking UI,创建自定义仪表盘,添加折线图或柱状图,选择指标为
Endpoint CPM(请求数),分组维度勾选endpoint和x-api-key,即可按API Key拆分展示端点请求统计。 - 自定义前端仪表盘:通过React/Vue等前端框架调用上述查询接口或PG查询结果,渲染成目标格式:
- /some-endpoint (apiKey_1) 3
- /some-endpoint (apiKey_2) 1
内容的提问来源于stack exchange,提问作者Артемий Кудрявцев
相关产品推荐
相关产品推荐

