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

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


linux:grafana

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:grafana [2023/11/05 06:42]
admin [Настройка gui]
linux:grafana [2024/05/24 10:14] (текущий)
admin
Строка 3: Строка 3:
 ===== Установка ===== ===== Установка =====
 <code bash> <code bash>
 +# (не работает, была смена ключей, надо какой то другой ключ импортировать, хз какой)
   # Добавляем ключи и репозиторий:   # Добавляем ключи и репозиторий:
 apt install gnupg2 && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - apt install gnupg2 && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
Строка 67: Строка 68:
   * count_non_null() — количество значений, отличных от null;   * count_non_null() — количество значений, отличных от null;
 </details> </details>
 +
 +==== Общее ====
 +**Единицы измерения в графиках**\\
 +Для данных есть два варианта, "**SI**" (в килобайте 1000 байт) и "**IEC**" (в килобайте 1024 байт)\\
 +**EIC**, когда в килобайте 1024 байт еще называют "кибибайтом", когда для расчета используется степень двойки (более традиционная форма для ИТ собсна), обозначается "**КиБ или KiB**"\\
 +
 +
 +==== Repeat/Перечисление списка элементов ====
 +Можно сделать автоматический репит графиков, с подстановкой списка из переменной\\
 +Например переменная со списком хостов, чтобы автоматом создать графики для каждого хоста из списка, в json модели нужно сделать такую иерархию:\\
 +"summary" это агрегация, создавались в ручную, обычные графики, для перечисления создаем вложенную панель, с указанием "[$HOST]" в имени\\
 +{{:linux:wiki_0.jpg?direct&800|}}
 +
 +
 +
  
  
Строка 74: Строка 90:
 Потребляет мало ресурсов благодаря неполной индексации. Интегрируется с разными системами в т.ч. с самой Grafana.\\ Потребляет мало ресурсов благодаря неполной индексации. Интегрируется с разными системами в т.ч. с самой Grafana.\\
 В **promtail** для выборки, хранения и парсинга данных используются метки, эти метки (по типу категорий) можно использовать для анализа/отображения.\\ В **promtail** для выборки, хранения и парсинга данных используются метки, эти метки (по типу категорий) можно использовать для анализа/отображения.\\
 +
 +
 +
 +
 +===== 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>
 +
 +
 +
 +
 +
 +
 +
  
  
  
linux/grafana.1699166564.txt.gz · Последнее изменение: 2023/11/05 06:42 — admin