докер + пром + графана + альтернативный менеджер

основы докера

docker run -it --name centos -v $HOME:/tmp -p 8080:8080 centos
docker inspect container   #查看已启动容器启动命令
docker container prune    #删除退出的容器
docker ps -a --no-trunc    #查看容器启动参数

Обратный контроль dockerfile

方法一:
docker history --format {{.CreatedBy}} --no-trunc=true 0e0218889c33|sed "s?/bin/sh\ -c\ \#(nop)\ ??g"|sed "s?/bin/sh\ -c?RUN?g" | tac

方法二:
apt-get install npm    #管理前端包工具
npm install npx
npx dockerfile-from-image node:8 > dockerfile   #解析dockerfile

Измените команду запуска образа контейнера - docker изменит команду запуска

#使用宿主机网络,并将容器名称修改为prometheus,-d后台运行
docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus

#将容器里文件拷贝出来到root目录
docker cp prometheus:/etc/prometheus/prometheus.yml /root/

#修改后挂载加进去
docker run -d -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml   \
-p 9090:9090 --name prometheus --net=host prom/prometheus

docker logs contianid   #查看日志
docker search  java    #从docker hub中搜索java镜像,可以查看版本

Контейнерный порт

9100 node-export
9090
прометей 3000 графана

запускать

  • Старт узла-экспортера
docker run -d --name=node-exporter -p 9100:9100 prom/node-exporter
  • Начать графану

    密码:admin,admin;配置文件/etc/grafana
    docker run -d --name=grafana -p 3000:3000 grafana/grafana
  • Начать выпускной
    
    #将容器里文件拷贝出来到root目录
    docker cp prometheus:/etc/prometheus/prometheus.yml /root/


# После модификации добавьте монтирование в docker run -d -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-p 9090: 9090 --name prometheus --net = host prom / prometheus


# docker 镜像自启动
- 在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:

docker run --restart = always
Если он был запущен, вы можете использовать следующую команду:
docker update --restart = always <CONTAINER ID>


# 配置文件
## prom配置
配置帮助
```yaml

global:
  #默认情况下抓取目标的频率.
  [ scrape_interval: <duration> | default = 1m ]

  # 抓取超时时间.
  [ scrape_timeout: <duration> | default = 10s ]

  # 评估规则的频率.
  [ evaluation_interval: <duration> | default = 1m ]

  # 与外部系统通信时添加到任何时间序列或警报的标签
  #(联合,远程存储,Alertma# nager).
  external_labels:
    [ <labelname>: <labelvalue> ... ]

# 规则文件指定了一个globs列表. 
# 从所有匹配的文件中读取规则和警报.
rule_files:
  [ - <filepath_glob> ... ]

# 抓取配置列表.
scrape_configs:
  [ - <scrape_config> ... ]

# 警报指定与Alertmanager相关的设置.
alerting:
  alert_relabel_configs:
    [ - <relabel_config> ... ]
  alertmanagers:
    [ - <alertmanager_config> ... ]

# 与远程写入功能相关的设置.
remote_write:
  [ - <remote_write> ... ]

# 与远程读取功能相关的设置.
remote_read:
  [ - <remote_read> ... ]

Конкретное размещение

root@ubuntu:~# 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.
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

  - job_name: prometheus
    static_configs:
    - targets: ['192.168.191.128:9090']
      labels:
        instance: prometheus
  - job_name: 'consul' #prometheus与consul配置段
    consul_sd_configs:
      - server: '192.168.191.128:8500'
        services: [ ]
  - job_name: node-exporter
    static_configs:
    - targets: ['192.168.191.128:9100']
      labels:
        instance: node-exporter

Динамическая конфигурация file_sd_config:

  • Измените /usr/local/prometheus/*.json, чтобы добавить и удалить, поддержите динамическое обновление
    
    在prometheus.yaml配置文件最后增加
    - job_name: 'node-discorvery'   #发现规则名称
    file_sd_configs:                       #选择适配器
      - files: 
        - /usr/local/prometheus/*.json   #匹配文件

Добавьте в соответствующий каталог /usr/local/prometheus/*.json, и контейнер нужно будет смонтировать при запуске.
[
{
"Target": ["10.10.2.99:9100"],
"labels": {
"job": "linux- bj ",
" idc ":" bj-jiuxianqiao "
}
},
{
" target ": [" 10.10.2.62:9100","10.10.1.35:9100 "],
" labels ": {
" job ":" linux- gx ",
" idc ":" gz-daxuecheng "
}
}
]


## rule_files:配置
- 配置告警规则,在prometheus.yml中指定规则文件目录
- prometheus根据这些规则信息,会推送报警信息到alertmanager中。
```yaml

alertmanager_config: конфигурация

  • Укажите экземпляр Alertmanager, которому сервер Prometheus отправляет предупреждения
  • Укажите параметры для настройки взаимодействия с этими диспетчерами предупреждений.
  • Alertmanagers поддерживает статическое обозначение или обозначение динамического обнаружения
  • relabel_configs позволяет выбирать диспетчеров оповещений из обнаруженных сущностей и обеспечивает расширенные изменения используемого пути API, который отображается через метку __alerts_path__
    # Alertmanager configuration   #告警配置
    alerting:
    alertmanagers:  
    - static_configs:  #告警规则,也可以基于动态的方式进行告警。
    - targets:     
      # - alertmanager:9093

remote_write

Укажите адрес api записи внутреннего хранилища.

remote_read

Задает адрес API чтения хранилища серверной части.

relabel_config

  • Перемаркировка - это мощный инструмент, который может динамически переписывать набор тегов цели перед сканированием цели. Каждую конфигурацию сканирования можно настроить с несколькими шагами перемаркировки. Они применяются к набору тегов каждой цели в том порядке, в котором они указаны в файле конфигурации. По умолчанию вы можете видеть связанные теги в веб-консоли Prometheus:
    докер + пром + графана + альтернативный менеджер

использовать

Promtheus использование

докер + пром + графана + альтернативный менеджер

node_cpu_seconds_total {cpu = "0"}
докер + пром + графана + альтернативный менеджер

Используйте графану

адрес панели управления grafana

Прометей экспортер

Мониторинг процессов экспортера процессов

docker search process-exporter   #查看排名最高的
docker pull opvizorpa/process-exporter   #下载
docker inspect 9ec6749205fc      #查看镜像启动配置信息:9256端口
apt-get install nginx         #安装nginx测试

docker run -d --rm -p 9256:9256 --privileged -v /proc:/host/proc -v `pwd`:/config ncabatoff/process-exporter --procfs /host/proc -config.path /config/filename.yml

# 本地安装
[root@host-10-10-2-62 ~]# wget https://github.com/ncabatoff/process-exporter/releases/download/v0.5.0/process-exporter-0.5.0.linux-amd64.tar.gz
[root@host-10-10-2-62 ~]# tar -xf process-exporter-0.5.0.linux-amd64.tar.gz -C /usr/local/

# 开机自启动
[root@host-10-10-2-62 process-exporter-0.5.0.linux-amd64]# cat /etc/systemd/system/process-exporter.service 
[Unit]
Description=node exporter
Documentation=node exporter

[Service]
ExecStart=/usr/local/process-exporter-0.5.0.linux-amd64/process-exporter -config.path /usr/local/process-exporter-0.5.0.linux-amd64/process-name.yaml 

[Install]
WantedBy=multi-user.target

# 配置文件根据变量名匹配到配置文件:  
{{.Comm}} 包含原始可执行文件的basename,/proc/stat 中的换句话说,2nd 字段  
{{.ExeBase}} 包含可执行文件的basename  
{{.ExeFull}} 包含可执行文件的完全限定路径  
{{.Matches}} 映射包含应用命令行tlb所产生的所有匹配项

# 增加监控nginx配置文件
root@ubuntu:~# cat process-name.yaml 
process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'nginx'

# 监控所有进程
[root@host-10-10-2-62 process-exporter-0.5.0.linux-amd64]# cat process-name.yaml 
process_names:
  - name: "{{.Comm}}"
    cmdline:
    - '.+'

# prometheus server添加监控
  - job_name: 'process'
    static_configs: 
      - targets: ['10.10.2.62:9256']

# 进程查询
统计有多少个进程数:sum(namedprocess_namegroup_states)

统计有多少个僵尸进程:sum(namedprocess_namegroup_states{state="Zombie"})

шлюз

Конфигурация

pushgateway 9091

docker pull prom/pushgateway

docker run -d \
--name=pushgateway \
-p 9091:9091 \
prom/pushgateway

访问ip+9091

prometheus配置文件中prometheus.yml添加target:
  - job_name: pushgateway
    static_configs:
      - targets: ['192.168.191.128:9091']
        labels:
          instance: pushgateway

URL:http://<ip>:9091/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>},

Данные тестирования push

echo "some_metric 3.14" | curl --data-binary @- http://192.168.191.128:9091/metrics/job/some_job

# 一次性推送多条数据
cat <<EOF | curl --data-binary @http://192.168.2.14:9091/metrics/job/some_job/instance/some_instance
 # TYPE some_metric counter
 some_metric{label="val1"} 42
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF
  • Можно обнаружить, что данные в pushgateway обычно группируются и классифицируются по заданию и экземпляру, поэтому эти два параметра незаменимы.

докер + пром + графана + альтернативный менеджер

Подсчитайте текущие одновременные соединения TCP и отправьте их на pushgateway

[root@host-10-10-2-109 ~]# cat count_netstat_esat_connections.sh 
#!/bin/bash
instance_name=`hostname -f | cut -d'.' -f1`  #获取本机名,用于后面的的标签
label="count_netstat_established_connections"  #定义key名
count_netstat_established_connections=`netstat -an | grep -i ESTABLISHED | wc -l`  #获取数据的命令
echo "$label: $count_netstat_established_connections"
echo "$label  $count_netstat_established_connections" | curl --data-binary @- http://10.10.2.109:9091/metrics/job/pushgateway_test/instance/$instance_name
  • Метка в имени домена представляет имя метки, за которым следует значение. За заданием стоит определение pushgateway_test (в соответствии с определением prometheus, доменного имени), а переменная instance_name представляет имя хоста.

докер + пром + графана + альтернативный менеджер

  • Те, кто проницателен, обнаружат, что здесь что-то не так. Имя задания, для которого только что был отправлен индикатор, принадлежит exported_job = "pushgateway_test", а задание отображается как job = "pushgateway". Это явно неверно. В чем причина? Фактически, это определяется параметром honor_labels (по умолчанию false) в конфигурации Prometheus.
  - job_name: pushgateway
    honor_labels: true
    static_configs:
      - targets: ['10.10.2.109:9091'] 
        labels:
          instance: pushgateway 

докер + пром + графана + альтернативный менеджер

Отправка данных pushgateway интерфейса Python:

1、安装prometheus\_client模块:
apt install python-pip
pip install prometheus_client

2、简单示例文件:

[root@host-10-10-2-109 ~]# cat client.py 
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
registry = CollectorRegistry()
g = Gauge('job_last_success_unixtime', 'Last time a batch job successfully finished', registry=registry)
g.set_to_current_time()
push_to_gateway('localhost:9091', job='batchA', registry=registry)
#执行脚本
[root@host-10-10-2-109 ~]# python client.py 

3. Результаты запроса:
докер + пром + графана + альтернативный менеджер

докер + пром + графана + альтернативный менеджер

4. Внесите небольшие изменения и получите данные ping:

[root@host-10-10-2-109 ~]# cat client_ping.py 
#!/usr/bin/python
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
registry = CollectorRegistry()
g = Gauge('ping', 'pingtime',['dst_ip','city'], registry=registry) #Guage(metric_name,HELP,labels_name,registry=registry)
g.labels('192.168.1.10','shenzhen').set(42.2)    #设置标签
g.labels('192.168.1.11','shenzhen').set(41.2)
g.labels('192.168.1.12','shenzhen').set(32.1)  
push_to_gateway('localhost:9091', job='ping_status', registry=registry)
[root@host-10-10-2-109 ~]# python client_ping.py 

докер + пром + графана + альтернативный менеджер
докер + пром + графана + альтернативный менеджер

promql

Вектор диапазона

  • s - секунды
  • м - минуты
  • ч - часы
  • d - дни
  • w - недели
  • y-лет работы со сменой времени:
    prometheus_http_requests_total{handler="/api/v1/query"}[5m]
    prometheus_http_requests_total{} offset 5m #返回5分钟前的样本,瞬时位移
    prometheus_http_requests_total{}[1d] offset 1d  #返回昨天一天的数据样本,区间位移

Скалярное значение с плавающей запятой

Скалярные значения с плавающей запятой могут быть записаны прямо в форме [-](digits)[.(digits)].

例如: 20
У скаляра только одно число и нет времени. Следует отметить, что при использовании выражения count (http_requests_total) возвращаемый тип данных по-прежнему является мгновенным вектором. Пользователь может преобразовать один мгновенный вектор в скаляр с помощью встроенной функции scalar ().

Строка: строка

"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t`

Оператор Promql

Помимо использования PromQL для удобного запроса и фильтрации временных рядов, PromQL также поддерживает множество операторов.Пользователи могут использовать эти операторы для дальнейшей обработки последовательности событий. К этим операторам относятся: математические операторы, логические операторы, логические операторы и т. Д.

вычисление

Все математические операторы, поддерживаемые PromQL, следующие:

 + (加法)
  - (减法)
  * (乘法)
  / (除法)
  % (求余)
  ^ (幂运算)

Например, если мы запрашиваем размер памяти хоста, возвращается Bytes. Если я хочу преобразовать его в G, я могу использовать следующее выражение:

node_memory_MemTotal_bytes / 1024 /1024 /1024

Возвращаемый результат - мгновенный вектор. Математический расчет между двумя мгновенными векторами, например:

node_disk_written_bytes_total + node_disk_read_bytes_total #返回的是多块磁盘之间的读写IO

Затем мы обнаружим, что математические операции выполняются на основе метки выражения для вычисления io диска vda и vdb соответственно.

Логическая операция

В PromQL через режим сопоставления тегов пользователи могут запрашивать их в соответствии с характеристическими измерениями временного ряда. Логическая операция позволяет пользователям фильтровать временные ряды на основе значения выборки во временном ряду, что часто используется в наших правилах сигнализации.

Prometheus поддерживает следующие логические операторы:


 == (相等)
 != (不相等)
 > (大于)
 < (小于)
 >= (大于等于)
 <= (小于等于)

Используйте модификатор bool для возврата соответствующих результатов запроса:

Например: с помощью математических операторов мы можем легко вычислить текущее использование памяти всеми хост-узлами:

(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total

Когда мы пишем правила сигнализации, нам нужно отфильтровать хосты, использование памяти которых превышает 95%, вы можете использовать логические выражения:

(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total &gt; 0.95

Установить оператор

Выражение мгновенного вектора можно использовать для получения набора, содержащего несколько временных рядов, который мы называем мгновенным вектором. Посредством операций набора соответствующие операции набора могут выполняться между двумя мгновенными векторами и мгновенными векторами. В настоящее время Prometheus поддерживает следующие операторы множества:

and (并且)
or (或者)
unless (排除)

vector1 и vector2 сгенерируют новый вектор, состоящий из элементов vector1. Этот вектор содержит элементы в векторе1, которые точно соответствуют элементам в векторе2.

vector1 или vector2 сгенерирует новый вектор, содержащий все образцы данных в vector1 и образцы данных в vector2, которые не соответствуют vector1.

vector1, если vector2 не сгенерирует новый вектор, а элементы в новом векторе состоят из элементов в vector1, которые не соответствуют vector2.

Приоритет оператора

В системе Prometheus порядок приоритета бинарных операторов от высокого к низкому:

 ^
*, /, %
 +, -
 ==, !=, <=, <, >=, >
 and, unless
or

Операторы с таким же приоритетом ассоциативны (левоассоциативны). Например, 2 3% 2 эквивалентно (2 3)% 2. Оператор ^ является исключением, ^ удовлетворяет правоассоциативности, например 2 ^ 3 ^ 2 эквивалентно 2 ^ (3 ^ 2).

Операция агрегирования

Prometheus также предоставляет следующие встроенные операторы агрегирования, которые действуют на мгновенные векторы. Образцы данных, возвращаемые мгновенным выражением, можно агрегировать для формирования нового временного ряда.

 sum (求和)
 min (最小值)
 max (最大值)
 avg (平均值)
 stddev (标准差)
 stdvar (标准差异)
 count (计数)
 count_values (对value进行计数)
 bottomk (后n条时序)
 topk (前n条时序)
 quantile (分布统计)

Синтаксис использования операций агрегирования следующий:

&lt;aggr-op&gt;([parameter,] &lt;vector expression&gt;) [without|by (&lt;label list&gt;)]

Среди них только параметры count_values, quantile, topk и bottomk.

without используется для удаления перечислимых тегов из результатов вычислений и сохранения других тегов. По - наоборот: в результирующем векторе сохраняются только перечисленные теги, а остальные теги удаляются. Постепенно данные можно агрегировать по типовым вопросам.

sum(http_requests_total) without (instance)
等于:
sum(http_requests_total) by (code,handler,job,method)

Если вам нужно только рассчитать общее количество HTTP-запросов для всего приложения, вы можете напрямую использовать выражение:

sum(http_requests_total)
查询数据的平均值:
avg(http_requests_total)
查询最靠前的3个值:
topk(3, http_requests_total)

Общие функции

Prometheus предоставляет множество функций вычисления для различных типов данных. Одна небольшая хитрость - найти тип данных счетчика. Перед выполнением любой операции поместите функцию rate () или Increase (). Вот несколько наиболее часто используемых функций, которые помогут понять:

функция увеличения () :

Эта функция используется с типом данных счетчика для получения первой и последней выборок в векторе интервала и возврата его роста. Если разделить на определенное время, можно получить среднюю скорость роста за это время:

increase(node_cpu_seconds_total[2m]) / 120 # Средняя загрузка ЦП хост-узла за последние две минуты

Функция rate () :

Эта функция используется с данными типа счетчика, принимая среднее значение счетчика в секунду за этот период времени.

rate(node_cpu_seconds_total[2m]) #直接计算区间向量在时间窗口内平均增长速率

Функция sum () :

В реальной работе большинство процессоров являются многоядерными, и node_cpu будет отображать данные каждого ядра отдельно.На самом деле, нас не заботит индивидуальная ситуация каждого ядра, а общая ситуация с процессором. После использования функции sum () для суммирования вы можете получить общие данные, но sum () суммирует данные всех машин, так что вы можете снова взять по (instance) или по (cluster_name). Данные ЦП одного сервера или группы серверов. Вышеуказанная формула может быть преобразована в:

sum( increase(node_cpu_seconds_total[1m]) ) #先找出每一个,然后再合并

Topk () : эта функция может извлекать верхнее значение N из большого количества данных, и N можно настроить. Например, если вы отслеживаете 320 процессоров 100 серверов, вы можете использовать эту функцию для просмотра тех, которые имеют более высокую текущую нагрузку, для тревоги:

topk(3, http_requests_total) #统计最靠前的3个值。

Функция pred_linear () : вычисляет скорость изменения кривой и играет определенную роль в прогнозировании. Например, уровень доступности диска в текущий час резко упал. Эта ситуация может привести к быстрому заполнению диска. В это время вы можете использовать эту функцию для прогнозирования состояния на следующие несколько часов с текущими данными за один час для достижения раннего предупреждения. :

predict_linear( node_filesystem_free_bytes{mountpoint="/"}[1h],4*3600 ) &lt; 0 #如果未来4小时后磁盘使用率为负数就会报警

Дизассемблирование выражения использования процессора

1. Сначала найдите ключ, например, чтобы проверить использование ЦП, затем следует использовать ключ node_cpu

2. Отфильтруйте время простоя ЦП и все время ЦП на основе ключа node_cpu и используйте {} для фильтрации

node_cpu_seconds_total{ mode='idle' }  #找出空闲CPU的值
node_cpu_seconds_total  #不写其他参数代表ALL

3. Используйте функцию увеличения (), чтобы получить данные за 1 минуту. В это время извлекаются данные каждого процессора.

increase(node_cpu_seconds_totalmode='idle'}[1m])

4. Используйте функцию sum (), чтобы суммировать данные каждого процессора, чтобы получить отдельные данные:

sum( increase(node_cpu_seconds_total{mode='idle'}[1m]) )

5. Хотя функция sum () суммирует данные каждого ЦП, она также суммирует данные каждого сервера.Данные ЦП всех серверов одинаковы, и их необходимо обработать один раз. А вот и новая функция от (instance). Он разделит значение суммы, суммированное вместе, в соответствии с указанным методом, а экземпляр представляет имя машины. Если вы не пишете by (instance), вам нужно указать, какие данные экземпляра необходимы в {}.

sum( increase(node_cpu_seconds_total{mode='idle'}[1m]) ) by (instance) #空闲CPU一分钟增量

6. Получите процент времени простоя процессора:

sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance) /sum(increase(node_cpu_seconds_total[1m])) by(instance)

7. Загрузка ЦП:

1-(sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance) /sum(increase(node_cpu_seconds_total[1m])) by(instance)) * 100

Окончательный расчет может быть отрицательным, и многие шаблоны Granafa могут быть такими: Когда ЦП находится в многоядерном режиме и низкой нагрузке, разница в значениях будет увеличиваться, что приведет к отрицательному числу.

Несколько часто используемых выражений

1. Рассчитайте коэффициент использования ЦП:

100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100)

2. Использование памяти:

(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100

3. Использование диска

100 - (node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs|rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs|rootfs"} * 100)

4. Процент iowait ЦП хост-узла:
avg(irate(node_cpu_seconds_total{mode="iowait"}[5m])) by (instance) * 100

5. Загрузка системы на 1 минуту:
sum by (instance) (node_load1)

6. Трафик сетевой карты:
avg(irate(node_network_receive_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]))by (environment,instance,device)

Справочный блог

-Alinode официальный анализ изображений и извлечение файла Dockerfile | Сайт тестирования веб-технологий-
Hub.docker.com для графаны в докере, официальный справочный документ
ncabatoff / process-exporter: Prometheus exporter

рекомендация

отblog.51cto.com/14223698/2574538
рекомендация