当前位置: 首页 > news >正文

可观测性:日志、指标与追踪

可观测性:日志、指标与追踪

大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊可观测性这个重要话题。作为一个全栈开发者,可观测性是保障系统稳定运行的关键。今天就来分享一下日志、指标与追踪的实战经验。

可观测性概述

什么是可观测性?

可观测性是指通过外部输出(日志、指标、追踪)理解系统内部状态的能力

三大支柱

支柱说明工具
日志事件的结构化记录ELK、Loki
指标数值型数据的聚合Prometheus
追踪分布式系统的请求路径Jaeger、Zipkin

日志管理

日志收集

const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), new winston.transports.Console({ format: winston.format.simple() }) ] }); // 使用 logger.info('User logged in', { userId: '123' }); logger.error('Database connection failed', { error: err.message });

日志结构化

const structuredLogger = winston.createLogger({ format: winston.format.combine( winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.json() ), transports: [new winston.transports.Console()] }); // 结构化日志输出 // { // "level": "info", // "message": "Order created", // "timestamp": "2024-01-01T12:00:00.000Z", // "orderId": "abc123", // "userId": "456" // }

指标监控

Prometheus配置

# prometheus.yml global: scrape_interval: 15s scrape_configs: - job_name: 'node_exporter' static_configs: - targets: ['localhost:9100'] - job_name: 'app_metrics' static_configs: - targets: ['localhost:3000']

自定义指标

const client = require('prom-client'); const httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'] }); const requestCounter = new client.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status_code'] }); // 在中间件中使用 app.use((req, res, next) => { const start = Date.now(); res.on('finish', () => { const duration = (Date.now() - start) / 1000; httpRequestDuration.observe({ method: req.method, route: req.path, status_code: res.statusCode }, duration); requestCounter.inc({ method: req.method, route: req.path, status_code: res.statusCode }); }); next(); }); // 暴露指标端点 app.get('/metrics', (req, res) => { res.set('Content-Type', client.register.contentType); res.send(client.register.metrics()); });

分布式追踪

OpenTelemetry配置

const { NodeSDK } = require('@opentelemetry/sdk-node'); const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-base'); const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); const sdk = new NodeSDK({ traceExporter: new ConsoleSpanExporter(), instrumentations: [getNodeAutoInstrumentations()] }); sdk.start();

自定义追踪

const { trace } = require('@opentelemetry/api'); const tracer = trace.getTracer('my-service'); async function processOrder(orderId) { return tracer.startActiveSpan('process-order', async (span) => { span.setAttribute('orderId', orderId); try { await validateOrder(orderId); await updateInventory(orderId); await sendNotification(orderId); } finally { span.end(); } }); }

实战案例:完整监控系统

class MonitoringSystem { constructor() { this.logger = this.setupLogger(); this.metrics = this.setupMetrics(); this.tracer = this.setupTracer(); } setupLogger() { return winston.createLogger({ level: 'info', format: winston.format.json(), transports: [new winston.transports.Console()] }); } setupMetrics() { const client = require('prom-client'); return { requests: new client.Counter({ name: 'app_requests_total', help: 'Total requests' }), latency: new client.Histogram({ name: 'app_request_latency_seconds', help: 'Request latency' }) }; } setupTracer() { const { trace } = require('@opentelemetry/api'); return trace.getTracer('app-tracer'); } log(level, message, metadata) { this.logger[level](message, metadata); } recordRequest(duration) { this.metrics.requests.inc(); this.metrics.latency.observe(duration); } }

最佳实践

1. 统一日志格式

// 使用ECS格式 const ecsFormat = winston.format((info) => { return { '@timestamp': info.timestamp, 'log.level': info.level, 'message': info.message, 'service.name': 'my-service', ...info.metadata }; });

2. 设置告警规则

# Prometheus Alertmanager配置 groups: - name: example rules: - alert: HighErrorRate expr: sum(rate(http_requests_total{status_code="5xx"}[5m])) / sum(rate(http_requests_total[5m])) > 0.1 for: 5m labels: severity: critical annotations: summary: High error rate detected

总结

可观测性是现代系统运维的核心。通过日志、指标和追踪,可以全面了解系统状态,快速定位问题。

我的鬃狮蜥Hash对可观测性也有自己的理解——它总是能感知周围环境的变化,这也许就是自然界的"可观测性"吧!

如果你对可观测性有任何问题,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!


技术栈:可观测性 · 日志 · 指标 · 追踪

http://www.rkmt.cn/news/1430390.html

相关文章:

  • 3DS游戏格式转换神器:5分钟将3DS文件转为CIA安装包
  • 告别手动拖拽!用CANape脚本自动化添加观测/标定量,提升效率50%
  • 告别IP和端口:群晖DSM7反向代理实战,把局域网Jellyfin、aria2都挂上你的专属域名
  • Win11下JDK17与Burpsuite 2024保姆级联动配置指南(含一键启动脚本)
  • HS2-HF_Patch终极指南:新手如何快速安装Honey Select 2汉化去码补丁
  • 文档分类实战:从业务痛点到智能落地的完整指南
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan怎么集成看这
  • jQuery Mobile CSS 类详解
  • 【私密级AI工作台配置白皮书】:军工级端到端加密+离线语音唤醒+自动上下文隔离——仅限前500名技术人的定制化部署手册
  • Spring AI 提示词工程实战:让大模型更懂你的意图
  • ​2028江西首届统一职教高考全面启新,升学格局迎来重大变革 大圣学成好 - 新闻快传
  • 量子纠错码硬件实现与HAL算法解析
  • Lindy测试流程自动化不是选择题,而是生存线:2024年QA团队必须在Q3前完成的4项强制动作
  • 上海车主真实测评:开了8个月Model 3,说说最实在的使用感受 - 新闻快传
  • 三沙本地专业防水TOP5靠谱推荐:家里漏水不用愁,免费上门不求人。本地最新防水企业资讯:专业师傅持证上门,收费透明无隐藏收费,质保5-10年,售后有保障 - 企业资讯
  • AI内容生成工具实战指南:五大引擎解析与人机协作工作流
  • 动态图流异常检测实战:MIDAS算法原理与工程实现详解
  • 告别Vissim仿真‘撞车’和‘堵死’:手把手教你设置交叉口优先权与路径流量
  • 通达信缠论插件:5分钟让复杂K线图变成清晰交易地图
  • 3步永久解决英雄联盟回放版本不兼容:ROFL-Player终极指南
  • 别再死记硬背socket函数了!用C语言写一个TCP回显服务器,5分钟搞懂核心流程
  • 2026年BI数据分析系统哪个好:五家优选深度解析 - 科技焦点
  • 运维老鸟的私藏技巧:用Neofetch快速诊断服务器基础环境
  • 2026年杭州家装服务企业GEO服务商专业度对比:企业做AI搜索优化先看什么? - 新闻快传
  • 哔哩下载姬全攻略:解锁B站视频离线收藏的终极秘籍
  • [特殊字符] 终极免费手柄转换方案:DS4Windows让你的PS4手柄在PC上完美运行
  • 贺州本地专业防水TOP5靠谱推荐:家里漏水不用愁,免费上门不求人。本地最新防水企业资讯:专业师傅持证上门,收费透明无隐藏收费,质保5-10年,售后有保障 - 企业资讯
  • GetQzonehistory:3分钟搞定QQ空间数据备份,你的数字记忆管家
  • Arduino实现433MHz无线信号克隆:从原理到智能家居控制实践
  • 2026年杭州电子信息制造企业GEO服务商横向比较:谁更懂AI搜索优化 - 新闻快传