>  기사  >  차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

Linux中文社区
Linux中文社区앞으로
2023-08-03 14:53:431015검색

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

Prometheus는 시계열 데이터베이스를 기반으로 한 오픈 소스 모니터링 및 경보 시스템입니다. Prometheus에 관해 말하자면 온라인 음악 공유 플랫폼인 SoundCloud를 언급해야 합니다. YouTube에서 비디오 공유를 하기 위해 마이크로서비스 아키텍처의 길을 점점 더 나아가면서 수백 개의 서비스를 보유하고 있으며 전통적인 모니터링 시스템인 StatsD 및 Graphite를 사용하는 데에는 많은 제한이 있습니다.

그래서 그들은 2012년에 새로운 모니터링 시스템을 개발하기 시작했습니다. Prometheus의 원저자는 2012년에 SoundCloud에 합류한 Matt T. Proud입니다. 실제로 Matt는 SoundCloud에 합류하기 전에 Google에서 근무하면서 Google의 클러스터 관리자인 Borg와 모니터링 시스템인 Borgmon에서 영감을 얻어 오픈 소스를 개발했습니다. 소스 모니터링 시스템 Prometheus는 많은 Google 프로젝트와 마찬가지로 Go를 사용하는 프로그래밍 언어입니다.

분명히 마이크로서비스 아키텍처 모니터링 시스템을 위한 솔루션으로서 Prometheus는 컨테이너와도 분리될 수 없습니다. 2006년 8월 9일, Eric Schmidt는 Search Engine Conference에서 처음으로 클라우드 컴퓨팅(Cloud Computing) 개념을 제안했습니다. 이후 10년 동안 클라우드 컴퓨팅의 발전은 급속도로 이루어졌습니다.

2013년 Pivotal의 Matt Stine은 Cloud Native의 개념을 제안했습니다. Cloud Native는 마이크로서비스 아키텍처, DevOps 및 컨테이너로 대표되는 민첩한 인프라로 구성되어 기업이 소프트웨어를 빠르고 지속적이며 안정적으로 확장할 수 있도록 지원합니다.

클라우드 컴퓨팅 인터페이스와 관련 표준을 통일하기 위해 2015년 7월 리눅스재단 산하 CNCF(Cloud Native Computing Foundation)가 탄생했습니다. CNCF에 처음으로 합류한 프로젝트는 구글의 쿠버네티스(Kubernetes)였으며, 프로메테우스(Prometheus)가 두 번째로 합류했다(2016년).

현재 Prometheus는 Kubernetes 클러스터의 모니터링 시스템에 널리 사용되고 있습니다. Prometheus의 역사에 관심이 있는 학생들은 SoundCloud의 2016 PromCon 컨퍼런스에서 발표한 SoundCloud 엔지니어 Tobias Schmidt의 연설: The History of Prometheus at SoundCloud를 살펴보세요.

1. Prometheus 개요

SoundCloud의 공식 블로그에서 새로운 모니터링 시스템인 Prometheus: Monitoring을 개발해야 하는 이유에 대한 기사를 찾을 수 있습니다. 이 기사에서는 모니터링 시스템이 필요하다고 소개했습니다. 다음 네 가지 특성을 충족하세요.

간단히 말하면 다음 네 가지 특성입니다.

  • 다차원 데이터 모델
  • 편리한 배포 및 유지 관리
  • 유연한 데이터 수집
  • 강력한 쿼리 언어

사실 두 부분으로 구성된 다차원 데이터 모델과 강력한 쿼리 언어 이 기능은 바로 시계열 데이터베이스에 필요한 기능이므로 Prometheus는 모니터링 시스템일 뿐만 아니라 시계열 데이터베이스이기도 합니다. 그렇다면 Prometheus는 왜 기존 시계열 데이터베이스를 백엔드 스토리지로 직접 사용하지 않습니까? SoundCloud는 모니터링 시스템이 시계열 데이터베이스의 특성을 갖기를 원할 뿐만 아니라 배포 및 유지 관리가 매우 쉬워야 하기 때문입니다.

더 인기 있는 시계열 데이터베이스(아래 부록 참조)를 살펴보면 구성 요소가 너무 많거나 외부 종속성이 높습니다. 예를 들어 Druid에는 Historical, MiddleManager, Broker, Coordinator, Overlord, 및 라우터가 있으며 ZooKeeper, Deep Storage(HDFS 또는 S3 등), 메타데이터 저장소(PostgreSQL 또는 MySQL)에 따라 배포 및 유지 관리 비용이 매우 높습니다. Prometheus는 외부 분산 스토리지에 의존하지 않고 독립적으로 배포할 수 있는 분산형 아키텍처를 사용하여 몇 분 안에 모니터링 시스템을 구축할 수 있습니다.

또한 Prometheus 데이터 수집 방법도 매우 유연합니다. 대상의 모니터링 데이터를 수집하려면 먼저 대상에 데이터 수집 구성 요소를 설치해야 합니다. 이는 대상에서 모니터링 데이터를 수집하고 Prometheus가 Pull을 통해 이를 수집할 수 있도록 HTTP 인터페이스를 노출합니다. .데이터, 이는 기존 푸시 모드와 다릅니다.

그러나 Prometheus는 푸시 모드를 지원하는 방법도 제공합니다. 데이터를 Push Gateway로 푸시할 수 있으며, Prometheus는 Pull을 통해 Push Gateway에서 데이터를 얻습니다. 현재 내보내기는 이미 Docker, HAProxy, StatsD, JMX 등과 같은 대부분의 타사 데이터를 수집할 수 있습니다. 공식 웹사이트에는 내보내기 목록이 있습니다.

Prometheus는 이러한 네 가지 주요 기능 외에도 서비스 검색, 더욱 풍부한 차트 표시, 외부 저장소 사용, 강력한 경보 규칙 및 다양한 알림 방법과 같은 점점 더 많은 고급 기능을 지원하기 시작합니다. 다음 그림은 Prometheus의 전체 아키텍처 다이어그램입니다.

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

위 그림에서 볼 수 있듯이 Prometheus 생태계에는 Prometheus 서버, Pushgateway, Alertmanager, 웹 UI 등 여러 가지 주요 구성 요소가 포함되어 있지만 대부분의 구성 요소는 필수는 아닙니다. 물론 핵심 구성 요소는 지표 데이터 수집 및 저장, 표현식 쿼리 지원, 알람 생성을 담당하는 Prometheus 서버입니다. 다음으로 Prometheus 서버를 설치하겠습니다.

2. Prometheus 서버 설치

Prometheus는 Docker, Ansible, Chef, Puppet, Saltstack 등 다양한 설치 방법을 지원할 수 있습니다. 가장 간단한 두 가지 방법을 소개합니다. 하나는 바로 사용할 수 있는 컴파일된 실행 파일을 직접 사용하는 것이고, 다른 하나는 Docker 이미지를 사용하는 것입니다.

2.1은 기본적으로 작동합니다

먼저 공식 웹사이트의 다운로드 페이지에서 Prometheus의 최신 버전과 다운로드 주소를 얻으세요. 최신 버전은 2.4.3(2018년 10월)입니다. 다운로드하고 압축을 풀려면 다음 명령을 실행하세요.

$ wget https://github.com/prometheus/prometheus/releases/download/v2.4.3/prometheus-2.4.3.linux-amd64.tar.gz  
$ tar xvfz prometheus-2.4.3.linux-amd64.tar.gz

그런 다음 압축 해제 디렉터리로 전환하여 Prometheus 버전을 확인하세요.

$ cd prometheus-2.4.3.linux-amd64  
$ ./prometheus --version  
prometheus, version 2.4.3 (branch: HEAD, revision: 167a4b4e73a8eca8df648d2d2043e21bdb9a7449)  
  build user:       root@1e42b46043e9  
  build date:       20181004-08:42:02  
  go version:       go1.11.1

Prometheus 서버를 실행하세요.

$ ./prometheus --config.file=prometheus.yml
2.2 使用 Docker 镜像

使用 Docker 安装 Prometheus 更简单,运行下面的命令即可:

$ sudo docker run -d -p 9090:9090 prom/prometheus

一般情况下,我们还会指定配置文件的位置:

$ sudo docker run -d -p 9090:9090 \  
    -v ~/docker/prometheus/:/etc/prometheus/ \  
    prom/prometheus

我们把配置文件放在本地 ~/docker/prometheus/prometheus.yml,这样可以方便编辑和查看,通过 -v 参数将本地的配置文件挂载到 /etc/prometheus/ 位置,这是 prometheus 在容器中默认加载的配置文件位置。如果我们不确定默认的配置文件在哪,可以先执行上面的不带 -v 参数的命令,然后通过 docker inspect 命名看看容器在运行时默认的参数有哪些(下面的 Args 参数):

$ sudo docker inspect 0c  
[...]  
        "Id": "0c4c2d0eed938395bcecf1e8bb4b6b87091fc4e6385ce5b404b6bb7419010f46",  
        "Created": "2018-10-15T22:27:34.56050369Z",  
        "Path": "/bin/prometheus",  
        "Args": [  
            "--config.file=/etc/prometheus/prometheus.yml",  
            "--storage.tsdb.path=/prometheus",  
            "--web.console.libraries=/usr/share/prometheus/console_libraries",  
            "--web.console.templates=/usr/share/prometheus/consoles"  
        ],  
   
[...]
2.3 配置 Prometheus

正如上面两节看到的,Prometheus 有一个配置文件,通过参数 --config.file 来指定,配置文件格式为 YAML。我们可以打开默认的配置文件 prometheus.yml 看下里面的内容:

/etc/prometheus $ cat prometheus.yml   
# my global config  
global:  
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.  
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.  
  # scrape_timeout is set to the global default (10s).  
   
# Alertmanager configuration  
alerting:  
  alertmanagers:  
  - static_configs:  
    - targets:  
      # - alertmanager:9093  
   
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.  
rule_files:  
  # - "first_rules.yml"  
  # - "second_rules.yml"  
   
# A scrape configuration containing exactly one endpoint to scrape:  
# Here it's Prometheus itself.  
scrape_configs:  
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.  
  - job_name: &#39;prometheus&#39;  
   
    # metrics_path defaults to &#39;/metrics&#39;  
    # scheme defaults to &#39;http&#39;.  
   
    static_configs:  
    - targets: [&#39;localhost:9090&#39;]

Prometheus 默认的配置文件分为四大块:

  • 전역 블록: Prometheus의 전역 구성. 예를 들어 scrape_interval은 Prometheus가 데이터를 크롤링하는 빈도를 나타내고, Evaluation_interval은 경고 규칙이 감지되는 빈도를 나타냅니다.
  • alerting 블록: Alertmanager 구성에 대해서는 나중에 살펴보겠습니다. ;
  • rule_files 블록: 알람 규칙, 나중에 살펴보겠습니다.
  • scrape_config 블록: Prometheus라는 작업이 기본적으로 구성되어 있음을 알 수 있습니다. Prometheus가 시작되면 HTTP 인터페이스를 통해 자체 지표 데이터도 노출되는데, 이는 Prometheus 모니터링 자체와 동일합니다. 실제로 Prometheus를 사용할 때는 거의 쓸모가 없지만 이를 통해 Prometheus 사용 방법을 배울 수 있습니다. 예를 들어 http://localhost:9090/metrics에 액세스할 수 있습니다. Prometheus가 노출하는 메트릭을 확인하세요.

3. PromQL 알아보기

위 단계를 통해 Prometheus를 설치하면 이제 Prometheus를 경험할 수 있습니다. Prometheus는 작업을 용이하게 하기 위해 시각적인 웹 UI를 제공합니다. http://localhost:9090/을 방문하면 기본적으로 그래프 페이지로 이동합니다.

이 페이지를 처음 방문하면 당황할 수 있습니다. 먼저 다른 메뉴 아래의 콘텐츠를 살펴보세요. 예를 들어 경고는 정의된 모든 경보 규칙을 표시하고, 상태는 런타임 및 빌드 정보, 명령줄 플래그, 구성, 규칙, 대상, 서비스 검색 등을 포함한 다양한 Prometheus 상태 정보를 볼 수 있습니다. 등. .

사실 그래프 페이지는 Prometheus의 가장 강력한 기능입니다. 여기서는 Prometheus에서 제공하는 특수 표현식을 사용하여 모니터링 데이터를 쿼리할 수 있습니다. 이 표현식을 PromQL(Prometheus Query Language)이라고 합니다. PromQL을 통해 그래프 페이지의 데이터를 쿼리할 수 있을 뿐만 아니라, Prometheus에서 제공하는 HTTP API를 통해서도 쿼리할 수 있습니다. 조회된 모니터링 데이터는 목록과 그래프의 두 가지 형태로 표시될 수 있습니다(위 그림의 콘솔과 그래프 두 레이블에 해당).

위에서 말했듯이 Prometheus 자체도 그래프 페이지에서 쿼리할 수 있는 많은 모니터링 지표를 노출합니다. 실행 버튼 옆의 드롭다운 상자를 확장하면 많은 지표 이름을 선택할 수 있습니다. 예를 들어 promhttp_metric_handler_requests_total, 이 표시기는 /metrics 페이지 방문 횟수를 나타냅니다. Prometheus는 이 페이지를 사용하여 자체 모니터링 데이터를 캡처합니다. Console 태그의 쿼리 결과는 다음과 같습니다.

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

위의 Prometheus 구성 파일을 소개하면 scrape_interval 매개변수가 15s인 것을 알 수 있습니다. 이는 Prometheus가 15초마다 /metrics 페이지에 액세스한다는 의미이므로 15초 후에 표시값이 자동으로 증가하는 것을 볼 수 있습니다. 이는 그래프 태그에서 더 명확하게 볼 수 있습니다:

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?
3.1 数据模型

要学习 PromQL,首先我们需要了解下 Prometheus 的数据模型,一条 Prometheus 数据由一个指标名称(metric)和 N 个标签(label,N >= 0)组成的,比如下面这个例子:

promhttp\_metric\_handler\_requests\_total{code="200",instance="192.168.0.107:9090",job="prometheus"} 106

这条数据的指标名称为 promhttp_metric_handler_requests_total,并且包含三个标签 code、instance 和 job,这条记录的值为 106。上面说过,Prometheus 是一个时序数据库,相同指标相同标签的数据构成一条时间序列。如果以传统数据库的概念来理解时序数据库,可以把指标名当作表名,标签是字段,timestamp 是主键,还有一个 float64 类型的字段表示值(Prometheus 里面所有值都是按 float64 存储)。另外,搜索公众号Linux就该这样学后台回复“Linux”,获取一份惊喜礼包。

这种数据模型和 OpenTSDB 的数据模型是比较类似的,详细的信息可以参考官网文档 Data model。

虽然 Prometheus 里存储的数据都是 float64 的一个数值,但如果我们按类型来分,可以把 Prometheus 的数据分成四大类:

  • Counter
  • Gauge
  • Histogram
  • Summary

Counter는 요청 수, 작업 완료 수, 오류 수 등을 계산하는 데 사용됩니다. 값은 계속 증가하고 감소하지 않습니다. 게이지는 온도 변화, 메모리 사용량 변화 등 클 수도 있고 작을 수도 있는 일반적인 값입니다. 히스토그램은 요청 시간 및 응답 크기와 같은 이벤트 규모를 추적하는 데 자주 사용되는 히스토그램 또는 히스토그램입니다.

녹화된 콘텐츠를 그룹화할 수 있고 카운트 및 합계 기능을 제공하는 것이 특징입니다. 요약은 히스토그램과 매우 유사하며 이벤트 발생 규모를 추적하는 데에도 사용됩니다. 차이점은 추적 결과를 백분율로 나눌 수 있는 분위수 기능을 제공한다는 것입니다. 예를 들어, 분위수 값 0.95는 샘플링된 값에 있는 데이터의 95%를 취함을 의미합니다.

이 네 가지 유형의 데이터는 위에서 언급한 내보내기 프로그램인 표시기 제공자에 의해서만 구별됩니다. 자체 내보내기 프로그램을 작성하거나 기존 시스템에서 크롤링하기 위해 Prometheus에 대한 표시기를 노출해야 하는 경우 Prometheus 클라이언트 라이브러리를 사용할 수 있습니다. 이번에는 다양한 지표의 데이터 유형을 고려해야 합니다. 직접 구현할 필요는 없지만 기성 내보내기 도구를 직접 사용한 다음 Prometheus에서 관련 지표 데이터를 확인하면 이에 대해 너무 많은 주의를 기울일 필요가 없습니다. 그러나 데이터 유형을 이해하면 됩니다. Prometheus의 내용은 정확하고 합리적인 PromQL을 작성하는 데에도 도움이 됩니다.

3.2 PromQL 入门

我们从一些例子开始学习 PromQL,最简单的 PromQL 就是直接输入指标名称,比如:

# 表示 Prometheus 能否抓取 target 的指标,用于 target 的健康检查  
up

这条语句会查出 Prometheus 抓取的所有 target 当前运行情况,譬如下面这样:

up{instance="192.168.0.107:9090",job="prometheus"}    1  
up{instance="192.168.0.108:9090",job="prometheus"}    1  
up{instance="192.168.0.107:9100",job="server"}    1  
up{instance="192.168.0.108:9104",job="mysql"}    0

也可以指定某个 label 来查询:

up{job="prometheus"}

这种写法被称为 Instant vector selectors,这里不仅可以使用 = 号,还可以使用 !=、=~、!~,比如下面这样:

up{job!="prometheus"}  
up{job=~"server|mysql"}  
up{job=~"192\.168\.0\.107.+"}  
#=~ 是根据正则表达式来匹配,必须符合 RE2 的语法。

和 Instant vector selectors 相应的,还有一种选择器,叫做 Range vector selectors,它可以查出一段时间内的所有数据:

http_requests_total[5m]

这条语句查出 5 分钟内所有抓取的 HTTP 请求数,注意它返回的数据类型是 Range vector,没办法在 Graph 上显示成曲线图,一般情况下,会用在 Counter 类型的指标上,并和 rate() 或 irate() 函数一起使用(注意 rate 和 irate 的区别)。

# 计算的是每秒的平均值,适用于变化很慢的 counter  
# per-second average rate of increase, for slow-moving counters  
rate(http_requests_total[5m])  
   
# 计算的是每秒瞬时增加速率,适用于变化很快的 counter  
# per-second instant rate of increase, for volatile and fast-moving counters  
irate(http_requests_total[5m])

此外,PromQL 还支持 count、sum、min、max、topk 等 聚合操作,还支持 rate、abs、ceil、floor 等一堆的 内置函数,更多的例子,还是上官网学习吧。如果感兴趣,我们还可以把 PromQL 和 SQL 做一个对比,会发现 PromQL 语法更简洁,查询性能也更高。

3.3 HTTP API

我们不仅仅可以在 Prometheus 的 Graph 页面查询 PromQL,Prometheus 还提供了一种 HTTP API 的方式,可以更灵活的将 PromQL 整合到其他系统中使用,譬如下面要介绍的 Grafana,就是通过 Prometheus 的 HTTP API 来查询指标数据的。实际上,我们在 Prometheus 的 Graph 页面查询也是使用了 HTTP API。

我们看下 Prometheus 的 HTTP API 官方文档,它提供了下面这些接口:

GET /api/v1/query
GET /api/v1/query_range
GET /api/v1/series
GET /api/v1/label/<label_name>/values
GET /api/v1/targets
GET /api/v1/rules
GET /api/v1/alerts
GET /api/v1/targets/metadata
GET /api/v1/alertmanagers
GET /api/v1/status/config
GET /api/v1/status/flags

从 Prometheus v2.1 开始,又新增了几个用于管理 TSDB 的接口:

POST /api/v1/admin/tsdb/snapshot
POST /api/v1/admin/tsdb/delete_series
POST /api/v1/admin/tsdb/clean_tombstones

四、安装 Grafana

虽然 Prometheus 提供的 Web UI 也可以很好的查看不同指标的视图,但是这个功能非常简单,只适合用来调试。要实现一个强大的监控系统,还需要一个能定制展示不同指标的面板,能支持不同类型的展现方式(曲线图、饼状图、热点图、TopN 等),这就是仪表盘(Dashboard)功能。

因此 Prometheus 开发了一套仪表盘系统 PromDash,不过很快这套系统就被废弃了,官方开始推荐使用 Grafana 来对 Prometheus 的指标数据进行可视化,这不仅是因为 Grafana 的功能非常强大,而且它和 Prometheus 可以完美的无缝融合。

Grafana 是一个用于可视化大型测量数据的开源系统,它的功能非常强大,界面也非常漂亮,使用它可以创建自定义的控制面板,你可以在面板中配置要显示的数据和显示方式,它 支持很多不同的数据源,比如:Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus 等,而且它也 支持众多的插件。

下面我们就体验下使用 Grafana 来展示 Prometheus 的指标数据。首先我们来安装 Grafana,我们使用最简单的 Docker 安装方式:

$ docker run -d -p 3000:3000 grafana/grafana

运行上面的 docker 命令,Grafana 就安装好了!你也可以采用其他的安装方式,参考 官方的安装文档。安装完成之后,我们访问 http://localhost:3000/ 进入 Grafana 的登陆页面,输入默认的用户名和密码(admin/admin)即可。

要使用 Grafana,第一步当然是要配置数据源,告诉 Grafana 从哪里取数据,我们点击 Add data source 进入数据源的配置页面:

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

我们在这里依次填上:

RName: Prometheus
  • type: Prometheus
  • url: http: // localhost: 9090
  • Access: Browser
  • 여기에서 액세스는 Grafana 방문을 의미합니다. 데이터에는 두 가지 방법이 있습니다. 출처: 브라우저 및 프록시. 브라우저 모드는 사용자가 Grafana 패널에 액세스할 때 브라우저가 URL을 통해 데이터 소스에 직접 액세스하는 것을 의미하고, 프록시 모드는 브라우저가 먼저 Grafana의 프록시 인터페이스(인터페이스 주소는 /api/datasources/proxy)에 액세스한다는 것을 의미합니다. /), 이는 Grafana의 프록시 인터페이스에 의해 제어됩니다. 이 방법은 데이터 소스가 인트라넷에 배포되어 있고 사용자가 브라우저를 통해 직접 액세스할 수 없는 경우 매우 유용합니다.
데이터 소스를 구성한 후 Grafana는 기본적으로 사용할 수 있도록 구성된 여러 패널을 제공합니다. 아래 그림에 표시된 것처럼 Prometheus Stats, Prometheus 2.0 Stats 및 Grafana Metrics라는 세 가지 패널이 기본적으로 제공됩니다. 이 패널을 가져와서 사용하려면 가져오기를 클릭하세요.

Prometheus 2.0 Stats 패널을 가져오면 다음과 같은 모니터링 패널을 볼 수 있습니다. 회사가 여건이 된다면 대형 모니터를 신청해 벽에 걸고, 이 패널을 대형 화면에 투사해 온라인 시스템의 상태를 실시간으로 관찰할 수 있다는 점은 매우 멋지다고 할 수 있습니다.

5.Exporter를 사용하여 지표 수집

지금까지 본 것은 실제로 사용할 수 없는 일부 지표일 뿐입니다. 실제로 Prometheus를 프로덕션 환경에서 사용하려면 다양한 지표에 주의를 기울여야 하는 경우가 많습니다. 예를 들어 서버의 CPU 로드, 메모리 사용량, IO 오버헤드, 들어오고 나가는 네트워크 트래픽 등이 있습니다.

위에서 언급했듯이 Prometheus는 지표 데이터를 얻기 위해 Pull 메서드를 사용합니다. Prometheus가 대상에서 데이터를 얻으려면 먼저 대상에 지표 수집 프로그램을 설치하고 이 지표를 쿼리할 수 있는 HTTP 인터페이스를 노출해야 합니다. 수집 프로그램을 수출업체라고 합니다. 다양한 지표에 따라 수집하려면 다양한 수출업체가 필요합니다. 현재 우리가 일반적으로 사용하는 거의 모든 종류의 시스템과 소프트웨어를 포괄하는 다양한 수출업체가 있습니다.

공식 웹사이트에는 일반적으로 사용되는 내보내기 목록이 나열되어 있습니다. 각 내보내기는 포트 충돌을 피하기 위해 포트 규칙을 따릅니다. 즉, 전체 내보내기 포트 목록은 9100부터 시작하여 증가합니다. Kubernetes, Grafana, Etcd, Ceph 등과 같은 일부 소프트웨어 및 시스템은 자체적으로 Prometheus 형식으로 지표 데이터를 노출하는 기능을 제공하기 때문에 내보내기를 설치할 필요가 없다는 점도 주목할 가치가 있습니다.

이 섹션에서는 유용한 데이터를 수집해 보겠습니다.

5.1 收集服务器指标

首先我们来收集服务器的指标,这需要安装 node_exporter,这个 exporter 用于收集 *NIX 内核的系统,如果你的服务器是 Windows,可以使用 WMI exporter。

和 Prometheus server 一样,node_exporter 也是开箱即用的:

$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz  
$ tar xvfz node_exporter-0.16.0.linux-amd64.tar.gz  
$ cd node_exporter-0.16.0.linux-amd64  
$ ./node_exporter

node_exporter 启动之后,我们访问下 /metrics 接口看看是否能正常获取服务器指标:

$ curl http://localhost:9100/metrics

如果一切 OK,我们可以修改 Prometheus 的配置文件,将服务器加到 scrape_configs 中:

scrape_configs:  
  - job_name: &#39;prometheus&#39;  
    static_configs:  
      - targets: [&#39;192.168.0.107:9090&#39;]  
  - job_name: &#39;server&#39;  
    static_configs:  
      - targets: [&#39;192.168.0.107:9100&#39;]

修改配置后,需要重启 Prometheus 服务,或者发送 HUP 信号也可以让 Prometheus 重新加载配置:

$ killall -HUP prometheus

在 Prometheus Web UI 的 Status -> Targets 中,可以看到新加的服务器:

그래프 페이지의 표시기 드롭다운 상자에서 이름이 node로 시작하는 많은 표시기를 볼 수 있습니다. 예를 들어 node_load1Observe the server load:

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

Grafana에서 서버 표시기를 보려면 다음을 입력합니다. , Grafana 내보내기의 대시보드 페이지에서 노드를 검색할 수 있으며, 노드 내보내기 서버 메트릭 또는 노드 내보내기 전체 등과 같이 직접 사용할 수 있는 많은 패널 템플릿이 있습니다. Grafana의 가져오기 대시보드 페이지를 열고 패널의 URL(https://grafana.com/dashboards/405) 또는 ID(405)를 입력합니다.

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?
注意事项

一般情况下,node_exporter 都是直接运行在要收集指标的服务器上的,官方不推荐用 Docker 来运行 node_exporter。如果逼不得已一定要运行在 Docker 里,要特别注意,这是因为 Docker 的文件系统和网络都有自己的 namespace,收集的数据并不是宿主机真实的指标。可以使用一些变通的方法,比如运行 Docker 时加上下面这样的参数:

docker run -d \  
  --net="host" \  
  --pid="host" \  
  -v "/:/host:ro,rslave" \  
  quay.io/prometheus/node-exporter \  
  --path.rootfs /host

关于 node_exporter 的更多信息,可以参考 node_exporter 的文档 和 Prometheus 的官方指南 Monitoring Linux host metrics with the Node Exporter。

5.2 收集 MySQL 指标

mysqld_exporter 是 Prometheus 官方提供的一个 exporter,我们首先 下载最新版本 并解压(开箱即用):

$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz  
$ tar xvfz mysqld_exporter-0.11.0.linux-amd64.tar.gz  
$ cd mysqld_exporter-0.11.0.linux-amd64/

mysqld_exporter 需要连接到 mysqld 才能收集它的指标,可以通过两种方式来设置 mysqld 数据源。第一种是通过环境变量 DATA_SOURCE_NAME,这被称为 DSN(数据源名称),它必须符合 DSN 的格式,一个典型的 DSN 格式像这样:user:password@(host:port)/。

$ export DATA_SOURCE_NAME=&#39;root:123456@(192.168.0.107:3306)/&#39;  
$ ./mysqld_exporter

另一种方式是通过配置文件,默认的配置文件是 ~/.my.cnf,或者通过 --config.my-cnf 参数指定:

$ ./mysqld_exporter --config.my-cnf=".my.cnf"

配置文件的格式如下:

$ cat .my.cnf  
[client]  
host=localhost  
port=3306  
user=root  
password=123456

如果要把 MySQL 的指标导入 Grafana,可以参考 这些 Dashboard JSON。

注意事项

这里为简单起见,在 mysqld_exporter 中直接使用了 root 连接数据库,在真实环境中,可以为 mysqld_exporter 创建一个单独的用户,并赋予它受限的权限(PROCESS、REPLICATION CLIENT、SELECT),最好还限制它的最大连接数(MAX_USER_CONNECTIONS)。

CREATE USER &#39;exporter&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;password&#39; WITH MAX_USER_CONNECTIONS 3;  
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO &#39;exporter&#39;@&#39;localhost&#39;;
5.3 收集 Nginx 指标

官方提供了两种收集 Nginx 指标的方式。

  • 第一种是 Nginx metric library,这是一段 Lua 脚本(prometheus.lua),Nginx 需要开启 Lua 支持(libnginx-mod-http-lua 模块)。为方便起见,也可以使用 OpenResty 的 OPM(OpenResty Package Manager) 或者 luarocks(The Lua package manager) 来安装。
  • 第二种是 Nginx VTS exporter,这种方式比第一种要强大的多,安装要更简单,支持的指标也更丰富,它依赖于 nginx-module-vts 模块,vts 模块可以提供大量的 Nginx 指标数据,可以通过 JSON、HTML 等形式查看这些指标。Nginx VTS exporter 就是通过抓取 /status/format/json 接口来将 vts 的数据格式转换为 Prometheus 的格式。

不过,在 nginx-module-vts 最新的版本中增加了一个新接口:/status/format/prometheus,这个接口可以直接返回 Prometheus 的格式,从这点这也能看出 Prometheus 的影响力,估计 Nginx VTS exporter 很快就要退役了(TODO:待验证)。

除此之外,还有很多其他的方式来收集 Nginx 的指标,比如:nginx_exporter 通过抓取 Nginx 自带的统计页面 /nginx_status 可以获取一些比较简单的指标(需要开启 ngx_http_stub_status_module 模块);nginx_request_exporter 通过 syslog 协议 收集并分析 Nginx 的 access log 来统计 HTTP 请求相关的一些指标;nginx-prometheus-shiny-exporter 和 nginx_request_exporter 类似,也是使用 syslog 协议来收集 access log,不过它是使用 Crystal 语言 写的。还有 vovolie/lua-nginx-prometheus 基于 Openresty、Prometheus、Consul、Grafana 实现了针对域名和 Endpoint 级别的流量统计。另外,搜索公众号技术社区后台回复“猴子”,获取一份惊喜礼包。

有需要或感兴趣的同学可以对照说明文档自己安装体验下,这里就不一一尝试了。

5.4 收集 JMX 指标

最后让我们来看下如何收集 Java 应用的指标,Java 应用的指标一般是通过 JMX(Java Management Extensions) 来获取的,顾名思义,JMX 是管理 Java 的一种扩展,它可以方便的管理和监控正在运行的 Java 程序。

JMX Exporter 用于收集 JMX 指标,很多使用 Java 的系统,都可以使用它来收集指标,比如:Kafaka、Cassandra 等。首先我们下载 JMX Exporter:

$ wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar

JMX Exporter 是一个 Java Agent 程序,在运行 Java 程序时通过 -javaagent 参数来加载:

$ java -javaagent:jmx_prometheus_javaagent-0.3.1.jar=9404:config.yml -jar spring-boot-sample-1.0-SNAPSHOT.jar

其中,9404 是 JMX Exporter 暴露指标的端口,config.yml 是 JMX Exporter 的配置文件,它的内容可以 参考 JMX Exporter 的配置说明 。然后检查下指标数据是否正确获取:

$ curl http://localhost:9404/metrics

六、告警和通知

至此,我们能收集大量的指标数据,也能通过强大而美观的面板展示出来。不过作为一个监控系统,最重要的功能,还是应该能及时发现系统问题,并及时通知给系统负责人,这就是 Alerting(告警)。

Prometheus 的告警功能被分成两部分:一个是告警规则的配置和检测,并将告警发送给 Alertmanager,另一个是 Alertmanager,它负责管理这些告警,去除重复数据,分组,并路由到对应的接收方式,发出报警。常见的接收方式有:Email、PagerDuty、HipChat、Slack、OpsGenie、WebHook 等。

6.1 配置告警规则

我们在上面介绍 Prometheus 的配置文件时了解到,它的默认配置文件 prometheus.yml 有四大块:global、alerting、rule_files、scrape_config,其中 rule_files 块就是告警规则的配置项,alerting 块用于配置 Alertmanager,这个我们下一节再看。现在,先让我们在 rule_files 块中添加一个告警规则文件:

rule_files:  
  - "alert.rules"

然后参考 官方文档,创建一个告警规则文件 alert.rules:

groups:  
- name: example  
  rules:  
   
  # Alert for any instance that is unreachable for >5 minutes.  
  - alert: InstanceDown  
    expr: up == 0  
    for: 5m  
    labels:  
      severity: page  
    annotations:  
      summary: "Instance {{ $labels.instance }} down"  
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."  
   
  # Alert for any instance that has a median request latency >1s.  
  - alert: APIHighRequestLatency  
    expr: api_http_request_latencies_second{quantile="0.5"} > 1  
    for: 10m  
    annotations:  
      summary: "High request latency on {{ $labels.instance }}"  
      description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

这个规则文件里,包含了两条告警规则:InstanceDown 和 APIHighRequestLatency。顾名思义,InstanceDown 表示当实例宕机时(up === 0)触发告警,APIHighRequestLatency 表示有一半的 API 请求延迟大于 1s 时(api_http_request_latencies_second{quantile="0.5"} > 1)触发告警。

配置好后,需要重启下 Prometheus server,然后访问 http://localhost:9090/rules 可以看到刚刚配置的规则:

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

访问 http://localhost:9090/alerts 可以看到根据配置的规则生成的告警:

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

这里我们将一个实例停掉,可以看到有一条 alert 的状态是 PENDING,这表示已经触发了告警规则,但还没有达到告警条件。这是因为这里配置的 for 参数是 5m,也就是 5 分钟后才会触发告警,我们等 5 分钟,可以看到这条 alert 的状态变成了 FIRING。

6.2 使用 Alertmanager 发送告警通知

虽然 Prometheus 的 /alerts 页面可以看到所有的告警,但是还差最后一步:触发告警时自动发送通知。这是由 Alertmanager 来完成的,我们首先 下载并安装 Alertmanager,和其他 Prometheus 的组件一样,Alertmanager 也是开箱即用的:

$ wget https://github.com/prometheus/alertmanager/releases/download/v0.15.2/alertmanager-0.15.2.linux-amd64.tar.gz  
$ tar xvfz alertmanager-0.15.2.linux-amd64.tar.gz  
$ cd alertmanager-0.15.2.linux-amd64  
$ ./alertmanager

Alertmanager 启动后默认可以通过 http://localhost:9093/ 来访问,但是现在还看不到告警,因为我们还没有把 Alertmanager 配置到 Prometheus 中,我们回到 Prometheus 的配置文件 prometheus.yml,添加下面几行:

alerting:  
  alertmanagers:  
  - scheme: http  
    static_configs:  
    - targets:  
      - "192.168.0.107:9093"

这个配置告诉 Prometheus,当发生告警时,将告警信息发送到 Alertmanager,Alertmanager 的地址为 http://192.168.0.107:9093。也可以使用命名行的方式指定 Alertmanager:

$ ./prometheus -alertmanager.url=http://192.168.0.107:9093

这个时候再访问 Alertmanager,可以看到 Alertmanager 已经接收到告警了:

차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?

下面的问题就是如何让 Alertmanager 将告警信息发送给我们了,我们打开默认的配置文件 alertmanager.ym:

global:  
  resolve_timeout: 5m  
   
route:  
  group_by: [&#39;alertname&#39;]  
  group_wait: 10s  
  group_interval: 10s  
  repeat_interval: 1h  
  receiver: &#39;web.hook&#39;  
receivers:  
- name: &#39;web.hook&#39;  
  webhook_configs:  
  - url: &#39;http://127.0.0.1:5001/&#39;  
inhibit_rules:  
  - source_match:  
      severity: &#39;critical&#39;  
    target_match:  
      severity: &#39;warning&#39;  
    equal: [&#39;alertname&#39;, &#39;dev&#39;, &#39;instance&#39;]

其中 global 块表示一些全局配置;route 块表示通知路由,可以根据不同的标签将告警通知发送给不同的 receiver,这里没有配置 routes 项,表示所有的告警都发送给下面定义的 web.hook 这个 receiver;如果要配置多个路由,可以参考 这个例子:

routes:  
- receiver: &#39;database-pager&#39;  
  group_wait: 10s  
  match_re:  
    service: mysql|cassandra  
   
- receiver: &#39;frontend-pager&#39;  
  group_by: [product, environment]  
  match:  
    team: frontend

紧接着,receivers 块表示告警通知的接收方式,每个 receiver 包含一个 name 和一个 xxx_configs,不同的配置代表了不同的接收方式,Alertmanager 内置了下面这些接收方式:

email_config
hipchat_config
pagerduty_config
pushover_config
slack_config
opsgenie_config
victorops_config
wechat_configs
webhook_config

虽然接收方式很丰富,但是在国内,其中大多数接收方式都很少使用。最常用到的,莫属 email_config 和 webhook_config,另外 wechat_configs 可以支持使用微信来告警,也是相当符合国情的了。

실제로 다양한 메시징 소프트웨어가 있고 국가마다 다를 수 있으므로 포괄적인 알람 알림 방법을 제공하기가 어렵습니다. 따라서 Alertmanager는 새로운 수신기를 추가하지 않기로 결정했습니다. 하지만 웹후크를 사용하여 사용자 정의 수신 방법을 통합하는 것이 좋습니다. DingTalk를 Prometheus AlertManager WebHook에 연결하는 등의 통합 예시를 참고할 수 있습니다.

7. 자세히 알아보기

지금까지 Prometheus + Grafana + Alertmanager를 결합하면 매우 완벽한 모니터링 시스템을 완벽하게 구축할 수 있습니다. 하지만 실제로 사용해보면 더 많은 문제점을 발견하게 됩니다.

7.1 Service Discovery

Prometheus는 Pull을 통해 모니터링 데이터를 적극적으로 획득하기 때문에 모니터링 노드의 목록을 수동으로 지정해야 하며, 모니터링되는 노드 수가 증가할 경우 노드가 추가될 때마다 구성 파일을 변경해야 합니다. 이는 매우 번거로운 일입니다. 현재 이 문제는 서비스 검색(SD) 메커니즘을 통해 해결되어야 합니다.

Prometheus는 여러 서비스 검색 메커니즘을 지원하며 수집할 대상을 자동으로 얻을 수 있습니다. 포함된 서비스 검색 메커니즘에는 azure, consul, dns, ec2, openstack, file, gce, kubernetes, marathon, triton이 포함됩니다. ZooKeeper(신경, 서버세트)의 구성 방법은 매뉴얼의 구성 페이지를 참조하세요. SD 메커니즘은 매우 풍부하다고 할 수 있지만 현재 개발 리소스가 제한되어 있기 때문에 새로운 SD 메커니즘은 더 이상 개발되지 않고 파일 기반 SD 메커니즘만 유지됩니다. Linux 중국어 커뮤니티를 팔로우하세요

Prometheus 공식 블로그 Advanced Service Discovery in Prometheus 0.14.0의 이 기사와 같이 인터넷의 서비스 검색에 대한 많은 튜토리얼이 있습니다. 레이블 재지정 구성과 서비스 검색을 위해 DNS-SRV, Consul 및 파일을 사용하는 방법을 설명합니다.

또한 공식 웹사이트에서는 파일 기반 서비스 검색에 대한 소개 예제도 제공합니다. Julius Volz가 작성한 Prometheus 워크숍 입문 튜토리얼에서도 서비스 검색에 DNS-SRV를 사용합니다.

7.2 경고 구성 관리

Prometheus 구성이나 Alertmanager 구성에 관계없이 동적으로 수정할 수 있는 API는 없습니다. 매우 일반적인 시나리오는 Prometheus를 기반으로 사용자 정의 가능한 규칙을 사용하여 경보 시스템을 구축해야 한다는 것입니다. 사용자는 자신의 필요에 따라 페이지에서 경보 규칙을 생성, 수정 또는 삭제하거나 다음과 같이 경보 알림 방법 및 연락 담당자를 수정할 수 있습니다. Prometheus Google 그룹스에서 이 사용자의 질문: API 등을 통해 rule.conf 및 prometheus yml 파일에 경고 규칙을 동적으로 추가하는 방법은 무엇입니까?

그러나 불행히도 Simon Pasquier는 현재 그러한 API가 없으며 앞으로도 그러한 API를 개발할 계획이 없다고 말했습니다. 왜냐하면 그러한 기능은 Puppet, Chef, Ansible, 및 Salt. 이러한 구성 관리 시스템.

7.3 Pushgateway 사용

Pushgateway는 주로 일부 단기 작업을 수집하는 데 사용됩니다. 이러한 작업은 단기간 존재하기 때문에 Prometheus가 Pull에 오기 전에 사라질 수 있습니다. 관계자는 Pushgateway를 언제 사용해야 하는지 잘 설명해줍니다.

요약

프로메테우스는 지난 2년 동안 매우 빠르게 발전했고, 커뮤니티도 매우 활발하며, 중국에서 점점 더 많은 사람들이 프로메테우스를 연구하고 있습니다. 마이크로서비스, DevOps, 클라우드 컴퓨팅, 클라우드 네이티브와 같은 개념이 대중화됨에 따라 점점 더 많은 회사가 Docker와 Kubernetes를 사용하여 자체 시스템과 애플리케이션을 구축하기 시작하고 있으며 Nagios 및 Cacti와 같은 오래된 모니터링 시스템이 점점 더 대중화될 것입니다. 적용성이 낮을수록 프로메테우스는 결국 클라우드 환경에 가장 적합한 모니터링 시스템으로 발전할 것이라고 믿습니다.

위 내용은 차세대 모니터링 시스템으로 알려져 있습니다! 얼마나 멋진지 볼까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Linux中文社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제