当前位置: 首页 > 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.jsqmd.com/news/919069/

相关文章:

  • 3DS游戏格式转换神器:5分钟将3DS文件转为CIA安装包
  • 用HX711压力传感器做个厨房电子秤:从Arduino到STM32的完整DIY教程
  • MoRe-ERL框架:残差强化学习在机器人控制中的应用
  • 终极指南:如何使用smcFanControl让你的Intel Mac告别过热烦恼
  • HTML转Figma终极指南:如何将任何网站无缝转换为可编辑设计稿
  • 【限时解密】故宫/迪士尼/苹果合作方未公开的AI纪念品交互协议V2.3:含BLE 5.3+多模态触发SDK(首批申领仅剩87席)
  • 别再手动摆UV了!用UV-Packer插件处理ZBrush高模,完整流程分享
  • Gemini多模态计费规则首次公开解析(含图像/视频/长上下文Token折算公式)
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan集成全攻略
  • 用 Caddy 给 Docker 服务自动申请 HTTPS 证书
  • 模块二,Agent规划模式的四个工具思考
  • 如何通过Betaflight的模块化架构解决无人机飞控的三大核心挑战
  • 告别手动拖拽!用CANape脚本自动化添加观测/标定量,提升效率50%
  • 别再只用GetX做状态管理了!它的路由、主题、网络请求全家桶功能,一个Demo全搞定
  • 告别IP和端口:群晖DSM7反向代理实战,把局域网Jellyfin、aria2都挂上你的专属域名
  • 白话Skills之一:什么是 Skills?
  • 从40G到100G:手把手拆解XLGMII/CGMII接口的时钟、数据与控制信号(附时序图)
  • Unlock Music音乐解密工具:高效解锁加密音乐的完整免费方案
  • 商业智能实战:从数据孤岛到决策引擎的五大行业案例解析
  • Win11下JDK17与Burpsuite 2024保姆级联动配置指南(含一键启动脚本)
  • AI落地实战:构建高效人机协同系统的核心思路与工程实践
  • 别急着改GOOS!遇到Go文件被‘排除’,先检查这个VSCode/GoLand的隐藏设置
  • Scala核心编程(十一)数据结构之集合操作
  • HS2-HF_Patch终极指南:新手如何快速安装Honey Select 2汉化去码补丁
  • 文档分类实战:从业务痛点到智能落地的完整指南
  • 2026年上海小程序定制开发公司推荐榜单:从选型逻辑到十家全链路服务商深度横评 - 新闻快传
  • 用 changedetection.io 监控网页变化和价格变动
  • 保姆级教程:在Ubuntu 22.04/20.04上为PX4安装MAVROS(ROS2 Humble/Foxy避坑指南)
  • Python包安装总报错?可能是你的setuptools该升级了!一份给新手的避坑自查清单