Инструменты пользователя

Инструменты сайта


linux:grafana

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:grafana [2023/03/16 04:37]
admin
linux:grafana [2024/05/24 10:14] (текущий)
admin
Строка 2: Строка 2:
  
 ===== Установка ===== ===== Установка =====
-Добавляем ключи и репозиторий: +<code bash> 
-<code bash># apt install gnupg2 && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -</code> +# (не работает, была смена ключей, надо какой то другой ключ импортировать, хз какой) 
-<code bash>echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list</code>+  # Добавляем ключи и репозиторий: 
 +apt install gnupg2 && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - 
 +echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
  
-После этого ставим из репозитория +  # После этого ставим из репозитория 
-<code bash># apt update && apt install grafana</code>+apt update && apt install grafana
  
-После установки включаем и запускаем сервис +  # После установки включаем и запускаем сервис 
-<code bash># systemctl enabled grafana-server && systemctl start grafana-server</code>+systemctl enabled grafana-server && systemctl start grafana-server 
 +</code>
  
  
 ==== Установка из файла ==== ==== Установка из файла ====
 [[https://grafana.com/grafana/download|Тут можно посмотреть точную версию из числа доступных]], там же собсна и инструкция есть, пару команд (пользователя заводить вроде не обязательно): [[https://grafana.com/grafana/download|Тут можно посмотреть точную версию из числа доступных]], там же собсна и инструкция есть, пару команд (пользователя заводить вроде не обязательно):
- 
 <code bash>$ wget https://dl.grafana.com/oss/release/grafana_7.1.0_amd64.deb <code bash>$ wget https://dl.grafana.com/oss/release/grafana_7.1.0_amd64.deb
 $ sudo dpkg -i grafana_7.1.0_amd64.deb</code> $ sudo dpkg -i grafana_7.1.0_amd64.deb</code>
Строка 21: Строка 23:
  
  
-==== Настройка ====+==== Настройка cli ====
 Сервис работает на порту **3000**, учетка **admin**/**admin**\\ Сервис работает на порту **3000**, учетка **admin**/**admin**\\
 **Плагин для работы с Zabbix** **Плагин для работы с Zabbix**
Строка 41: Строка 43:
 sudo yum install ./google-chrome-stable_current_*.rpm sudo yum install ./google-chrome-stable_current_*.rpm
 </code> </code>
 +
 +
 +==== Настройка gui ====
 +Список элементов в переменной и исключение по регулярке\\
 +{{:linux:screenshot_6.jpg?direct&600|}}\\
 +
 +Переменная, фильтруется другой переменной, прометеус\\
 +{{:linux:sdvcsdfvfdv.jpg?direct&600|}}\\
 +
 +<details>
 +<summary>:!: Алерты</summary>
 +
 +function — функция для расчёта параметра. Возможные значения:
 +
 +  * avg() — среднее значение;
 +  * min() — минимальное значение;
 +  * max() — максимальное значение;
 +  * sum() — сумма всех значений;
 +  * count() — количество значений;
 +  * last() — последнее значение;
 +  * median() — среднее значение по медиане;
 +  * diff() — разница между значениями;
 +  * percent_diff() — разница между значениями в процентах;
 +  * count_non_null() — количество значений, отличных от null;
 +</details>
 +
 +==== Общее ====
 +**Единицы измерения в графиках**\\
 +Для данных есть два варианта, "**SI**" (в килобайте 1000 байт) и "**IEC**" (в килобайте 1024 байт)\\
 +**EIC**, когда в килобайте 1024 байт еще называют "кибибайтом", когда для расчета используется степень двойки (более традиционная форма для ИТ собсна), обозначается "**КиБ или KiB**"\\
 +
 +
 +==== Repeat/Перечисление списка элементов ====
 +Можно сделать автоматический репит графиков, с подстановкой списка из переменной\\
 +Например переменная со списком хостов, чтобы автоматом создать графики для каждого хоста из списка, в json модели нужно сделать такую иерархию:\\
 +"summary" это агрегация, создавались в ручную, обычные графики, для перечисления создаем вложенную панель, с указанием "[$HOST]" в имени\\
 +{{:linux:wiki_0.jpg?direct&800|}}
 +
 +
 +
  
  
Строка 50: Строка 92:
  
  
-===== Метрики из telegraf + InfluxDB ===== 
  
  
-==== ====+===== Alerting ===== 
 + 
 +<details> 
 +<summary>:!: Шаблоны в новой графане</summary> 
 +<code go> 
 +  # Указание шаблона в настройках канала оповещения 
 +{{ template "my_tempate" . }} 
 + 
 + 
 +  # Колво алертов 
 +{{ len .Alerts.Firing }} 
 +{{ len .Alerts.Resolved }} 
 + 
 + 
 +  # Перечислены оповещения и их статус 
 +{{ range .Alerts }} {{ .Status }}: {{ .Labels.alertname }} 
 +{{ end }} 
 + 
 + 
 +  # Вложенные шаблоны: 
 +  # определение шаблона 
 +{{ define "my_template" }} 
 + ... 
 +{{ end }} 
 + 
 + 
 +  # Использование 
 +summary: 
 +{{ template "my_template" . }} 
 + 
 + 
 +  # Удаление тегов 
 +{{ .Labels.Remove (stringSlice "alertname" "AlertGroup" "grafana_folder") }} 
 +{{ .Labels.alertname}} 
 + 
 + 
 +  # Прием "with" 
 +{{ with .ValueString }} 
 + {{- . | reReplaceAll `\[\s` "" | reReplaceAll `\],\s` "\n" }} 
 +{{ end }} 
 + 
 + 
 +  # Значения графика 
 +{{ .Values.max_mem }} 
 +{{ .ValueString }} 
 +{{- printf "%s - %s" .Labels.instance .Annotations.summary }} 
 +{{ printf "%.2f" .Labels "instance" }} 
 +{{ index $values printf "used_percent" | printf "%.1f" }} 
 + 
 + 
 +  # Так же, хороший совет занести нужные данные в summary/description алерта, 
 +  # затем в шаблоне обращаться к этому полю для получения данных 
 +# Поле Description в алерте: 
 +"instance={{ index $labels "instance" }} value={{ index $values "B" }}" 
 +# В шаблоне: 
 +{{ index .Annotations "description" }} 
 + 
 + 
 +  # Переменная (?) 
 +{{- $name := default .Chart.Name .Values.nameOverride }} 
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary>:!: Примеры </summary> 
 + 
 +<code go> 
 +{{ define "my_template" -}} 
 +  {{range .Alerts}} 
 +    {{ .Values.used_percent }} 
 +    {{ .Labels.alertname}} 
 +    {{ index .Annotations "description" }} 
 +  {{- end }} 
 +{{ end }} 
 +</code> 
 + 
 + 
 +<code go> 
 +{{ define "print_alert" }} 
 +  Summary: {{ .CommonAnnotations.Values }} 
 +   
 +  {{ len .Alerts.Firing }} firing alert(s): 
 +    {{ if .Alerts.Firing -}} 
 +      {{ range .Alerts.Firing -}}  
 +        {{ .Labels.Remove (stringSlice "alertname" "AlertGroup" "grafana_folder") }} 
 +        {{ with .ValueString }} 
 +          {{- . | reReplaceAll `\[\s` "" | reReplaceAll `\],\s` "\n" | reReplaceAll `\]` "" | reReplaceAll `var='[A-Z0-9a-z]+'\s` "" | reReplaceAll `labels=\{[A-Za-z0-9_\-\=\s\.:,]*\}\s` "" | reReplaceAll `metric='(.*)' ` "  **$1**: " | reReplaceAll `value=([0-9\.]+)` "$1" }} 
 +        {{ end }} 
 +      {{- end }} 
 +    {{- end }} 
 +   
 +    {{ len .Alerts.Resolved }} resolved alert(s): 
 +    {{ if .Alerts.Resolved -}} 
 +      {{ range .Alerts.Resolved -}}  
 +        {{ .Labels.Remove (stringSlice "alertname" "AlertGroup" "grafana_folder") }} 
 +        {{ with .ValueString }} 
 +          {{- . | reReplaceAll `\[\s` "" | reReplaceAll `\],\s` "\n" | reReplaceAll `\]` "" | reReplaceAll `var='[A-Z0-9a-z]+'\s` "" | reReplaceAll `labels=\{[A-Za-z0-9_\-\=\s\.:,]*\}\s` "" | reReplaceAll `metric='(.*)' ` "  **$1**: " | reReplaceAll `value=([0-9\.]+)` "$1" }} 
 +        {{ end }} 
 +      {{- end }} 
 +    {{- end }} 
 +{{ end }} 
 +</code> 
 + 
 + 
 +<code go> 
 +{{ define "my_template" -}} 
 +  {{ if .Alerts.Firing }} 
 +    **{{ len .Alerts.Firing }} firing alert(s)** 
 +    {{ template "summarize" .Alerts.Firing }} 
 +  {{- end }} 
 + 
 +  {{- if .Alerts.Resolved -}} 
 +    **{{ len .Alerts.Resolved }} resolved alert(s)** 
 +    {{ template "summarize" .Alerts.Resolved }} 
 +  {{- end }} 
 +{{- end }} 
 + 
 +{{ define "summarize" -}} 
 +  {{ range . }} 
 +    {{- printf "%s - %s" .Labels.instance .Annotations.summary }} 
 +  {{ end }} 
 +{{- end }} 
 +</code> 
 + 
 + 
 +<code go> 
 +{{ define "mm_title_alert_composite" }} 
 +{{- if eq ((index .Alerts 0).Labels._alert_type_) "CLASSIC" }} 
 +{{- template "mm_title_alert_composite.classic" . }}{{ end }} 
 +{{- if eq ((index .Alerts 0).Labels._alert_type_) "MULTI" }} 
 +{{- template "mm_title_alert_composite.multi" . }}{{ end }}{{ end }} 
 + 
 +{{/*MULTI*/}} 
 +{{ define "mm_title_alert_composite.classic" }} 
 +{{if .Alerts.Firing }} [Alerting] {{end}}{{ if .Alerts.Resolved }} [OK] {{end}}{{ .CommonLabels.alertname }} 
 +{{ end }} 
 + 
 +{{/*MULTI*/}} 
 +{{ define "mm_title_alert_composite.multi" }} 
 +{{ if and (gt (len .Alerts.Firing) 0) (eq (len .Alerts.Resolved) 0) -}} 
 +[FIRING:{{ len .Alerts.Firing }}] {{ .CommonLabels.alertname }} 
 +{{ else }}{{ if and (gt (len .Alerts.Resolved) 0) (eq (len .Alerts.Firing) 0) -}} 
 +[RESOLVED] {{ .CommonLabels.alertname }} 
 +{{ else -}} 
 +[FIRING:{{ len .Alerts.Firing }},RESOLVED:{{ len .Alerts.Resolved }}] {{ .CommonLabels.alertname }} 
 +{{ end }}{{ end }}{{ end }} 
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary>:!: Еще пример</summary> 
 +Чтобы получить значение, в правиле, в поле "summary" например пишем переменные 
 +<code go> 
 +// после "$values" указывается выражение, можно выбрать любое 
 +<b>{{ $labels.group }}</b>: {{ $values.A.Value }} 
 +</code> 
 + 
 +Пример шаблона 
 +<code go> 
 +{{ define "tg_body_alert_composite" -}} 
 +{{/* Стремление сделать один шаблон, тут разделение на типы алертов,  
 +с одним инстансом или с мульти, тип задается тегом, в правиле алерта */}} 
 +{{/* Примечательно, отступы здесь == отступы в сообщении, поэтому  
 +некоторые строки здесь выпадают из форматирования и прибиты к левой границе */}} 
 +{{- if eq ((index .Alerts 0).Labels._alert_type_) "CLASSIC" }} 
 + {{- template "tg_body_alert_composite.classic" . }} 
 +{{ else if eq ((index .Alerts 0).Labels._alert_type_) "MULTI" }} 
 + {{- template "tg_body_alert_composite.multi" . }} 
 +{{ else }} 
 + {{- (index .Alerts 0).Labels.alertname }} 
 +Label '_alert_type_' is not defined or invalid 
 + {{ end }} 
 +{{- end }} 
 + 
 +{{/* Тип алертов с одним инстансом (CLASSIC) */}} 
 +{{ define "tg_body_alert_composite.classic" -}} 
 + {{/* Возникновение алерта */}} 
 + {{- if .Alerts.Firing -}} 
 + {{ range .Alerts }}[Alerting] {{ .Labels.alertname }} 
 + {{ if .Annotations.description }} 
 +{{ .Annotations.description }} 
 + {{ end }} 
 + 
 + Metrics: 
 + {{- $value_of_metric := (.ValueString | reReplaceAll `.*metric='` "" | reReplaceAll `' labels.*` "") -}} 
 + {{ if ne $value_of_metric "Value" }} 
 + {{ with .ValueString }} 
 +{{- . | reReplaceAll `\[\s` "" | reReplaceAll `\],\s` "\n" | reReplaceAll `\]` "" | reReplaceAll `var='[A-Z0-9a-z]+'\s` "" | reReplaceAll `labels=\{[A-Za-z0-9_\-\=\s\.:,]*\}\s` "" | reReplaceAll `metric='(.*)' ` "  $1: " | reReplaceAll `value=([0-9\.]+)` "$1" }} 
 + {{ end }} 
 + {{ else }} 
 + {{ with .ValueString }} 
 +{{- . | reReplaceAll `\[\s` "" | reReplaceAll `\],\s` "\n" | reReplaceAll `\]` "" | reReplaceAll `var='[A-Z0-9a-z]+'\s` "" | reReplaceAll `metric='.*'\s` "" | reReplaceAll `labels={.*=(.*)}` "  $1: " | reReplaceAll `value=([0-9\.]+)` "$1" }} 
 + {{- end }} 
 + {{- end -}} 
 + 
 + {{- if .PanelURL }} 
 +Panel URL: {{ .PanelURL }} 
 + {{ end }} 
 + {{ end }} 
 + {{ end -}} 
 + 
 + {{/* Решение алерта */}} 
 + {{- if .Alerts.Resolved -}} 
 + {{ range .Alerts }}[OK] {{ .Labels.alertname }} 
 +{{ .Annotations.description }} 
 + {{- end }} 
 + {{- end -}} 
 + 
 +{{ end }} 
 + 
 + 
 +{{/* Тип алерта, когда много инстансов (MULTI) */}} 
 +{{ define "tg_body_alert_composite.multi" -}} 
 + {{ if (index .Alerts 0).Annotations.description -}} 
 +{{ (index .Alerts 0).Annotations.description -}} 
 + {{ end -}} 
 + 
 + {{/* Если состояние Firing, перечисляем переданные инстансы в подшаблоне "summarize_large" */}} 
 + {{- if .Alerts.Firing }} 
 +**{{ len .Alerts.Firing }} firing alert(s)** 
 + {{ template "tg_body_alert_composite.multi.summarize_large" .Alerts.Firing }} 
 + {{ end -}} 
 + 
 + {{/* Аналогично для состояния Resolve */}} 
 + {{- if .Alerts.Resolved }} 
 +**{{ len .Alerts.Resolved }} resolved alert(s)** 
 + {{- template "tg_body_alert_composite.multi.summarize_large" .Alerts.Resolved -}} 
 + {{ end -}} 
 + 
 + {{ if (index .Alerts 0).PanelURL }} 
 +Panel URL: {{ (index .Alerts 0).PanelURL }} 
 + {{- end }} 
 +{{- end }} 
 + 
 +{{/* Подшаблон для перечисления инстансов в цикле */}} 
 +{{ define "tg_body_alert_composite.multi.summarize_large" }} 
 + {{- range . -}}   
 +   {{/* Пишем поле "summary" каждого инстанса т.к.  
 + в алерте там переменные с данными */}} 
 + {{ index .Annotations "summary" -}} 
 + {{ end -}} 
 +{{ end }} 
 +</code> 
 +</details> 
 + 
 + 
 +===== Еще про алерты ===== 
 + 
 + 
 +<details> 
 +<summary>:!: Параметры</summary> 
 + 
 +Собсна в простом случае, запросом получаем какие то данные, первое выражение для агрегации данных, второе для оценки состояния\\ 
 +{{:linux:graf_1.png?direct&600|}}\\ 
 + 
 +{{:linux:graf_0.png?direct&600|}}\\ 
 + 
 + 
 +<code bash> 
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary>:!: </summary> 
 +<code bash> 
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary>:!: </summary> 
 +<code bash> 
 +</code> 
 +</details> 
 + 
 + 
 +===== API ===== 
 + 
 +<details> 
 +<summary>:!: Auth </summary> 
 + 
 +<code bash> 
 +curl http://admin:admin@localhost:3000/api/org 
 +</code> 
 +</details> 
 + 
 + 
 + 
 +<details> 
 +<summary>:!: silence </summary> 
 + 
 +Получить перечень 
 +<code bash> 
 +curl -X 'GET' 'http://admin:admin@192.168.0.14:3000/api/alertmanager/grafana/api/v2/silences'
 +  -H 'accept: application/json' 
 + 
 +http://192.168.0.14:3000/api/alertmanager/grafana/api/v2/silences 
 +</code> 
 + 
 + 
 +Создать новый 
 +<code bash> 
 +curl -X 'POST'
 +  'http://admin:admin@192.168.0.14:3000/api/alertmanager/grafana/api/v2/silences'
 +  -H 'accept: application/json'
 +  -H 'Content-Type: application/json'
 +  -d '{ 
 +  "comment": "comment_string", 
 +  "createdBy": "automatic_rule", 
 +  "startsAt": "2024-01-27T07:00:00.000Z", 
 +  "endsAt": "2024-01-27T09:00:00.000Z", 
 +  "matchers":
 +    { 
 +      "isEqual": true, 
 +      "isRegex": false, 
 +      "name": "name", 
 +      "value": "my_four_alert" 
 +    } 
 +  ] 
 +}' 
 +</code> 
 + 
 +</details> 
 + 
 + 
 + 
 + 
 + 
 + 
  
-<code bash></code> 
  
  
linux/grafana.1678941459.txt.gz · Последнее изменение: 2023/03/16 04:37 — admin