APM-Grafana-Mimir代替Prometheus实现指标长期存储

APM-Grafana-Mimir代替Prometheus实现指标长期存储

博主其他文章

基础版的APMALG(Alloy+Loki+Grafana)轻量级日志系统

进阶版的APMAPM-基于Grafana生态以及OTLP协议的Java轻量级日志监控系统(ALG系统进阶版)_otlp 存储s3-CSDN博客

Quickwit代替ALG中LokiAPM-基于Quickwit以及OTLP协议的轻量级Java日志系统

初始化

文件夹

sh 复制代码
# 配置文件
mkdir -p /data/apm/mimir-config/config

# rustfs(国产的对象存储, 类似Minio, 兼容s3协议)配置以及bugckt桶
mkdir -p /data/apm/rustfs/mimir-data

# mimir数据卷
mkdir -p /data/apm/mimir-1-data
mkdir -p /data/apm/mimir-2-data

配置

alloy配置文件
sh 复制代码
vim /data/apm/mimir-config/config/config.alloy
markdown 复制代码
// 基础设施指标收集组件一般都是prometheus.exporter.*的形式, 见官方文档https://grafana.com/docs/alloy/latest/reference/components/prometheus/
// 目标组件, 这里目标组件是Linux
prometheus.exporter.unix "node" {}
 
// 抓取目标组件指标
prometheus.scrape "node" {
  // 源
  targets         = prometheus.exporter.unix.node.targets
  // 指标转发
  forward_to      = [prometheus.relabel.node.receiver]
  // 10s抓取一次指标
  scrape_interval = "10s"
}

// 筛选指标
// prometheus.relabel 组件通常用于筛选 Prometheus 指标或标准化传递给一个或多个下游接收器的标签集
prometheus.relabel "node" {
  // 将address或者instance替换成host
  rule {
    action        = "replace"
    source_labels = ["__address__", "instance"]
    separator     = "/"
    target_label  = "host"
  }
  // 处理完后转发到组件
  forward_to = [prometheus.remote_write.metrics_service.receiver]
}

prometheus.remote_write "metrics_service" {
  endpoint {
    // 转发给ng, ng转发给mimir
    url = "http://load-balancer:9009/api/v1/push"
    headers = {
      // 替换为你的实际 org id, 如果没有这个会导致401没有权限
      "X-Scope-OrgID" = "demo",  
    }
    send_native_histograms = true
    send_exemplars = true
  }
}

grafana数据源配置

sh 复制代码
vim /data/apm/mimir-config/config/grafana-provisioning-datasources.yaml
yaml 复制代码
apiVersion: 1

datasources:
  - name: Mimir
    # 注意了, mimir的类型是prometheus
    type: prometheus
    access: proxy
    orgId: 1
    url: http://load-balancer:9009/prometheus
    version: 1
    editable: true
    jsonData:
      httpHeaderName1: "X-Scope-OrgID"
      alertmanagerUid: "alertmanager"
    secureJsonData:
      # 这个是租户ID, 用于过滤同一系统下不同租户的指标
      httpHeaderValue1: "demo"
    isDefault: true
  # 预警, 这里暂时用不上
  - name: Mimir Alertmanager
    uid: alertmanager
    type: alertmanager
    access: proxy
    orgId: 1
    url: http://load-balancer:9009/
    version: 1
    editable: true
    jsonData:
      httpHeaderName1: "X-Scope-OrgID"
      implementation: "cortex"
    secureJsonData:
      httpHeaderValue1: "demo"
Mimir配置
yaml 复制代码
# Do not use this configuration in production.
# It is for demonstration purposes only.
# Run Mimir in single process mode, with all components running in 1 process.
# target: all,alertmanager,overrides-exporter
# 这里选择单体多实例部署, 不采用微服务模式
target: all

# Configure Mimir to use Minio as object storage backend.
# s3对象存储配置
common:
  storage:
    backend: s3
    s3:
      endpoint: obs:9000
      access_key_id: whiteBrocade
      secret_access_key: whiteBrocade
      insecure: true
      # 桶的名称
      bucket_name: mimir-data

# Blocks storage requires a prefix when using a common object storage bucket.
blocks_storage:
  # 路径前缀
  # 在mimir中存储长这样, /mimir-data/mimir/租户ID/具体数据
  # /mimir-data是桶
  # mimir是存储路径前缀
  storage_prefix: mimir
  tsdb:
    dir: /data/ingester

# Use memberlist, a gossip-based protocol, to enable the 3 Mimir replicas to communicate
memberlist:
  join_members: [mimir-1, mimir-2]

# 预警规则和预警器都关了, 不启用
# ruler:
#   rule_path: /data/ruler
#   alertmanager_url: http://127.0.0.1:8080/alertmanager
#   ring:
#     # Quickly detect unhealthy rulers to speed up the tutorial.
#     heartbeat_period: 2s
#     heartbeat_timeout: 10s

# alertmanager:
#   data_dir: /data/alertmanager
#   fallback_config_file: /etc/alertmanager-fallback-config.yaml
#   external_url: http://localhost:9009/alertmanager

server:
  log_level: warn
ngnix配置
nginx 复制代码
events {
    worker_connections 1024;
}

http {
    # mimir负载均衡
    upstream backend {
        server mimir-1:8080 max_fails=1 fail_timeout=1s;
        server mimir-2:8080 max_fails=1 fail_timeout=1s backup;
    }

    server {
        listen 9009;
        access_log /dev/null;
        location / {
            proxy_pass http://backend;
        }
    }
}

docker compose文件

yaml 复制代码
version: "3.4"

networks:
  mimir_network:  # 创建专用网络确保服务隔离
    driver: bridge


services:
  # obs:
  #   image: minio/minio:RELEASE.2025-05-24T17-08-30Z
  #   container_name: mimio
  #   entrypoint: [""]
  #   command: ["sh", "-c", "mkdir -p /mimir-data/mimir && minio server --console-address :9001 --quiet /data"]
  #   environment:
  #     - MINIO_ROOT_USER=whiteBrocade
  #     - MINIO_ROOT_PASSWORD=whiteBrocade
  #   volumes:
  #     -/data/apm/minio:/data
  #   ports:
  #     - 9000:9000
  #     - 9001:9001
  #   networks:
  #     - mimir_network

  # 国产开源minio代替品
  obs:
    image: rustfs/rustfs:latest
    container_name: rustfs
    ports:
      - 9000:9000
    volumes:
      - /data/apm/rustfs:/data
    environment:
      # 控制台账号/密码
      - RUSTFS_ACCESS_KEY=whiteBrocade
      - RUSTFS_SECRET_KEY=whiteBrocade
      # 开启控制台
      - RUSTFS_CONSOLE_ENABLE=true
      # 白名单过滤
      # - RUSTFS_SERVER_DOMAINS=example.com
    networks:
      - mimir_network

  grafana:
    image: grafana/grafana:latest
    pull_policy: always
    container_name: grafana
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_USERS_DEFAULT_THEME=light
      - GF_LOG_MODE=console
      - GF_LOG_LEVEL=critical
    volumes:
      - /data/apm/mimir-config/config/grafana-provisioning-dashboards.yaml:/etc/grafana/provisioning/dashboards/provisioning-dashboards.yaml:ro
      - /data/apm/mimir-config/config/grafana-provisioning-datasources.yaml:/etc/grafana/provisioning/datasources/provisioning-datasources.yaml:ro
    ports:
      - 3000:3000
    networks:
      - mimir_network


  load-balancer:
    image: nginx:latest
    container_name: load-balancer
    volumes:
      - /data/apm/mimir-config/config/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - "mimir-1"
      - "mimir-2"
    ports:
      - 9009:9009
    networks:
      - mimir_network

  mimir-1:
    image: grafana/mimir:latest
    container_name: mimir-1
    command: ["-config.file=/etc/mimir.yaml"]
    depends_on:
      - obs
    volumes:
      - /data/apm/mimir-config/config/mimir.yaml:/etc/mimir.yaml
      # - /data/apm/mimir-config/config/alertmanager-fallback-config.yaml:/etc/alertmanager-fallback-config.yaml
      - /data/apm/mimir-1-data:/data
    networks:
      - mimir_network

  mimir-2:
    image: grafana/mimir:latest
    command: ["-config.file=/etc/mimir.yaml"]
    container_name: mimir-2
    hostname: mimir-2
    depends_on:
      - obs
    volumes:
      - /data/apm/mimir-config/config/mimir.yaml:/etc/mimir.yaml
      # 告警
      # - /data/apm/mimir-config/config/alertmanager-fallback-config.yaml:/etc/alertmanager-fallback-config.yaml
      - /data/apm/mimir-2-data:/data
    networks:
      - mimir_network

  alloy:
    image: grafana/alloy:latest
    container_name: alloy
    command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
    volumes:
      - /data/apm/mimir-config/config/config.alloy:/etc/alloy/config.alloy
    ports:
      - 12345:12345 
    networks:
      - mimir_network

需要注意的是这里的使用了对象存储有两个, 分别是Mimio, Rustfs, 一次只能启用一个(因为大家都使用到了9000端口)

测试

由于我是在WSL中Ubuntu中搭建的, 所以能通过localhost进行访问, 如果你的是云或者本地Vm虚拟机, 通过相应的IP即可

Rustfs

Rustfs: http://localhost:9000/

通过账号密码whiteBrocade/whiteBrocade登录后, 进入到这里的首页, 这里的mimir-data是之前运行留下的数据, 所以这里的对象数量和大小不是0

同理, 因为不是首次运行, 所以这里有demo的数据, 如果是首次运行, 那么这个demo的数据不会这么快出现, 而是在Mimir等待一段时间后才持久化到rustfs中

Alloy

Alloy: http://localhost:12345/graph

这里可以看到alloy指标采集流向图

Grafana

Grafana: http://localhost:3000/

通过账号密码admin/admin登录

导入Node Exporter Dashboard 20240520 通用JOB分组版 | Grafana Labs仪表盘, 并查看仪表盘, 发现已经成功采集到主机的数据了

拓展

如果想要将指标关联到日志, 追踪, 可以参考博主的APM-基于Grafana生态以及OTLP协议的Java轻量级日志监控系统(ALG系统进阶版)_otlp 存储s3-CSDN博客, 将mimir代替promethus即可

参考资料

RustFS - MinIO 国产化替代方案, 高性能分布式存储

GitHub - grafana/mimir: Grafana Mimir provides horizontally scalable, highly available, multi-tenant, long-term storage for Prometheus.

Grafana Mimir 文档 | Grafana Mimir 文档 - Grafana 可观测平台

一文搞懂 Grafana Mimir-腾讯云开发者社区-腾讯云

Zread

Node Exporter Dashboard 20240520 通用JOB分组版 | Grafana Labs

相关推荐
❀͜͡傀儡师1 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community1 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao2 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
java_logo3 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer4 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟4 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝4 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手4 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
Knight_AL5 小时前
使用 Docker 快速安装 GitLab(CentOS)
docker·centos·gitlab
牛奔5 小时前
grafana 二次开发,制作镜像流程
grafana