Thank you for reading this post, don't forget to subscribe!
Для решения задачи нам потребуется минимум — установленный Prometheus и node-exporter
(установка и базовая настройка), а также установленная Grafana с настроенным источником данных (Data source).
Убедитесь, что в node-exporter
включен коллектор textfile
и проверьте значение параметра -collector.textfile.directory
(обычно это /var/lib/node_exporter/textfile_collector
). Коллектор будет брать данные из всех файлов с расширением *.prom
в этой директории, содержимое файлов должно соответствовать определенному формату.
В каталоге /usr/local/sbin
создаем файл http_response_time_ms
и делаем его исполняемым:
1 2 |
touch http_response_time_ms |
1 2 |
chmod +x http_response_time_ms |
Скрипт http_response_time_ms
, выполняющий замеры данных и записывающий их в нужном формате в файл, выглядит так:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/usr/bin/perl use strict; my @domains = ("web1.example.com","web2.example.com","web3.example.com"); my @urls = ("/","/jobs/348443/","/resumes/329829/","/about-us/"); my $filename = "/var/lib/node_exporter/textfile_collector/http_response_time_ms.prom"; sub get_url { my $cur_url = $_[0]; my $content = `/usr/bin/curl -s -w %{time_total}\\n -o /dev/null "$cur_url"`; } open(my $fh, '>', $filename); print $fh "# HELP http_response_time_ms The HTTPS response time single page in miliseconds\n# TYPE http_response_time_ms gauge\n"; foreach (@domains){ my $domain = $_; foreach (@urls){ my $value = $_; my $url = "https://".$domain.$value; my @time; for (my $i=0; $i<3;$i++){ $time[$i] = get_url($url); } my @sorted = sort { $a <=> $b } @time; my $counter = 1000 * $sorted[1]; print $fh 'http_response_time_ms{domain="'.$domain.'",url="'.$value.'"} '.$counter."\n"; }; }; close $fh; exit 0; |
[/codesyntax]
В результате выполнения скрипта сформируется файл /var/lib/node_exporter/textfile_collector/http_response_time_ms.prom
с таким содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="hljs-comment"># HELP http_response_time_ms The HTTPS response time single page in miliseconds</span> <span class="hljs-comment"># TYPE http_response_time_ms gauge</span> <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web1.example.com/" rel="nofollow">web1.example.com</a>"</span>,url=<span class="hljs-string">"/"</span>} 54 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web1.example.com/" rel="nofollow">web1.example.com</a>"</span>,url=<span class="hljs-string">"/jobs/348443/"</span>} 124 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web1.example.com/" rel="nofollow">web1.example.com</a>"</span>,url=<span class="hljs-string">"/resumes/329829/"</span>} 116 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web1.example.com/" rel="nofollow">web1.example.com</a>"</span>,url=<span class="hljs-string">"/about-us/"</span>} 46 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web2.example.com/" rel="nofollow">web2.example.com</a>"</span>,url=<span class="hljs-string">"/"</span>} 53 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web2.example.com/" rel="nofollow">web2.example.com</a>"</span>,url=<span class="hljs-string">"/jobs/348443/"</span>} 129 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web2.example.com/" rel="nofollow">web2.example.com</a>"</span>,url=<span class="hljs-string">"/resumes/329829/"</span>} 122 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web2.example.com/" rel="nofollow">web2.example.com</a>"</span>,url=<span class="hljs-string">"/about-us/"</span>} 53 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web3.example.com/" rel="nofollow">web3.example.com</a>"</span>,url=<span class="hljs-string">"/"</span>} 55 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web3.example.com/" rel="nofollow">web3.example.com</a>"</span>,url=<span class="hljs-string">"/jobs/348443/"</span>} 127 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web3.example.com/" rel="nofollow">web3.example.com</a>"</span>,url=<span class="hljs-string">"/resumes/329829/"</span>} 105 <span class="hljs-attribute">http_response_time_ms</span>{domain=<span class="hljs-string">"<a class="vglnk" href="http://web3.example.com/" rel="nofollow">web3.example.com</a>"</span>,url=<span class="hljs-string">"/about-us/"</span>} 50 |
Проверим наличие метрик — в браузере переходим по адресу http://[IP-адрес сервера]:9100/metrics, новые метрики должны появиться через несколько секунд после выполнения скрипта.
Переходим в Grafana и создаем новый дашборд для графиков. В данном примере будем использовать шаблоны для имен хостов (ранее мы уже использовали шаблоны для интервалов времени).
Добавляем новый график, в поле Query вводим интересующую нас метрику — http_response_time_ms{domain="$host"}
, а в поле Legend format вводим {{ domain }}{{ url }}
. По сути, этого уже достаточно для отображения графика, для более тонкой настройки можно воспользоваться меню, которое расположено прямо под графиком.