云原生可观测性体系建设从0到1搭PrometheusGrafanaELKSkyWalking全家桶大家好我是迪哥。以前线上出问题我们靠猜现在靠看——看指标、看日志、看链路。这套 Prometheus Grafana ELK SkyWalking 组合拳让我们的故障发现时间从小时级降到了秒级。今天聊聊如何从零搭建这套可观测性体系。什么是可观测性三个支柱指标Metrics系统层面数据CPU、内存、QPS日志Logs事件层面数据请求、报错链路Traces请求层面数据调用链路、耗时分布架构全景┌─────────────────────────────────────────────────────────────────┐ │ Grafana (可视化) │ └────┬────────────────────────┬────────────────────────┬───────┘ │ │ │ ▼ ▼ ▼ ┌───────────────┐ ┌────────────────┐ ┌────────────────────┐ │ Prometheus │ │ Elasticsearch │ │ SkyWalking │ │ (指标存储) │ │ (日志存储) │ │ (链路存储) │ └───────┬───────┘ └────────┬───────┘ └───────────┬───────┘ │ │ │ └──────────┬──────────┴───────────┬───────────┘ │ │ ┌──────▼─────────┐ ┌──────▼─────────┐ │ Node Exporter│ │ Filebeat/Loki│ │ (系统指标) │ │ (日志收集) │ └──────┬─────────┘ └──────┬─────────┘ │ │ ┌──────▼─────────────────────▼─────────┐ │ K8s 应用集群 │ └──────────────────────────────────────┘一、指标Prometheus Grafana安装 Prometheus# prometheus.yml global: scrape_interval: 15s scrape_configs: - job_name: kubernetes-pods kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true部署到 K8shelm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring应用暴露指标Micrometerdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency dependency groupIdio.micrometer/groupId artifactIdmicrometer-registry-prometheus/artifactId /dependencymanagement: endpoints: web: exposure: include: prometheus,health,info,metricsGrafana 仪表盘推荐的 ID1860Node Exporter系统监控4701JVM Micrometer11378Spring Boot 2.1二、日志ELK Stack架构应用 → Filebeat → Elasticsearch → KibanaFilebeat 配置filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: ~ output.elasticsearch: hosts: [elasticsearch:9200]部署helm install elk elastic/elastic-stack -n monitoringKibana 查询示例# 查询错误日志 level: ERROR AND app: order-service AND timestamp now-1h # 查询慢请求 request_time 3 AND app: order-service三、链路SkyWalking部署 OAPapiVersion: apps/v1 kind: Deployment metadata: name: skywalking-oap spec: replicas: 2 template: spec: containers: - name: oap image: apache/skywalking-oap-server:9.4.0 env: - name: SW_STORAGE value: elasticsearch - name: SW_STORAGE_ES_CLUSTER_NODES value: elasticsearch:9200应用接入java -javaagent:/path/to/skywalking-agent.jar \ -Dskywalking.agent.service_nameorder-service \ -Dskywalking.collector.backend_serviceskywalking-oap:11800 \ -jar order-service.jarSkyWalking 常用功能拓扑图Topology一眼看出服务调用关系追踪Trace找到慢/错误链路性能剖析Profile代码级性能分析告警Alarm异常及时通知四、告警Alertmanager 钉钉/企业微信alerting: alertmanagers: - static_configs: - targets: [alertmanager:9093] route: receiver: dingtalk routes: - match: severity: critical receiver: dingtalk receivers: - name: dingtalk webhook_configs: - url: https://oapi.dingtalk.com/robot/send?access_tokenxxx告警规则示例groups: - name: service_alerts rules: - alert: HighErrorRate expr: error_rate 0.1 for: 5m labels: severity: critical annotations: summary: 服务 {{ $labels.app }} 错误率过高 description: 错误率为 {{ $value }}可观测性成熟度模型级别指标日志链路效果Level 0❌❌❌靠猜线上出问题慌得一批Level 1✅ 基础❌❌知道系统挂了但不知道为什么Level 2✅ 完善✅ 有❌能定位但复杂问题不行Level 3✅ 完善✅ 完善✅ 完善全方位可观测问题秒定位成本建议组件资源建议Prometheus4C8G保留 15 天Elasticsearch8C32G × 3 节点保留 7-30 天SkyWalking OAP4C16G × 2 节点Grafana2C4G经验总结不要追求完美先把指标和日志搞起来链路可以慢慢加数据保留策略不要无限期存成本扛不住告警要收敛太多告警会导致告警疲劳定期检查有没有漏采集有没有异常指标没人看与业务结合不仅看系统指标更要看业务指标下单量、支付成功率说到可观测性我家那只叫 Docker 的哈士奇最近在监视我的零食柜什么时候偷吃了偷吃了什么偷吃了多少它门儿清跟这套体系有的一拼 我是迪哥我们下期再见往期推荐《线上故障排查与应急响应实战》《系统容量规划与压测实战》