InfluxDB
Install Windows¶
Download InfluxDB 1.x Open Source
Invoke-RestMethod "https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10_windows_amd64.zip" -OutFile "$home\Downloads\influxdb-1.8.10_windows_amd64.zip"
Expand-Archive "$home\Downloads\influxdb-1.8.10_windows_amd64.zip" -DestinationPath "$home\Documents\"
Remove-Item "$home\Downloads\influxdb-1.8.10_windows_amd64.zip"
& "$home\Downloads\influxdb-1.8.10-1\influxd.exe"
Install Ubuntu¶
wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb
sudo dpkg -i influxdb_1.8.10_amd64.deb
systemctl start influxdb
systemctl status influxdb
ps aux | grep influxdb | grep -Ev "grep"
netstat -natpl | grep 80[8-9][3-9]
API¶
nano /etc/influxdb/influxdb.conf
[http]
enabled = true
bind-address = ":8086"
auth-enabled = false
systemctl restart influxdb
Chronograf¶
wget https://dl.influxdata.com/chronograf/releases/chronograf-1.10.2_windows_amd64.zip -UseBasicParsing -OutFile chronograf-1.10.2_windows_amd64.zip
Expand-Archive .\chronograf-1.10.2_windows_amd64.zip -DestinationPath 'C:\Program Files\InfluxData\chronograf\'
wget https://dl.influxdata.com/chronograf/releases/chronograf_1.10.2_amd64.deb
sudo dpkg -i chronograf_1.10.2_amd64.deb
systemctl status influxdb
http://192.168.3.102:8888
Grafana¶
invoke-RestMethod https://dl.grafana.com/enterprise/release/grafana-enterprise-10.3.1.windows-amd64.msi -OutFile "$home\Download\grafana.msi"
apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb
dpkg -i grafana-enterprise_10.3.1_amd64.deb
systemctl start grafana-server
systemctl status grafana-server
CLI Client¶
apt install influxdb-client
influx
influx --host 192.168.3.102 --username admin --password password
$influx_client_exec = "$home\Documents\influxdb-1.8.10-1\influx.exe"
& $influx_client_exec -host 192.168.3.102 -port 8086
help
show databases
use PowerShell
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m
USERS¶
SHOW USERS
отобразить пользователей и их права доступа
CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES
создать пользователя
GRANT ALL PRIVILEGES TO "admin"
предоставить права доступа
GRANT READ ON "database" TO "admin"
доступ на чтение для БД или запись (WRITE)
REVOKE ALL PRIVILEGES FROM "admin"
отозвать права доступа
SHOW GRANTS FOR "admin"
БД и привелегии доступа для указанного пользователя
SET PASSWORD FOR "admin" = 'new_password'
изменить пароль
DROP USER "admin"
удалить пользователя
DATABASE¶
CREATE DATABASE powershell
создать БД
SHOW DATABASES
отобразить список БД
DROP DATABASE powershell
удалить БД
USE powershell
SHOW measurements
отобразить все таблицы
INSERT performance,host=console,counter=CPU value=0.88
записать данные в таблицу performance
MEASUREMENT¶
SHOW TAG KEYS FROM "HardwareMonitor"
отобразить все тэги в таблице
SHOW TAG VALUES FROM "HardwareMonitor" WITH KEY = "HardwareName"
отобразить все значения указанного тэга
SHOW FIELD KEYS FROM "HardwareMonitor"
отобразить все Field Tags и их тип данных
SHOW SERIES FROM "HardwareMonitor"
отобразить список всех уникальных серий в указанной таблице. Серия - это набор точек данных, которые имеют одинаковые значения для всех тегов, за исключением времени.
DROP SERIES FROM "HardwareMonitor"
очистить все данные в таблице
DROP MEASUREMENT "HardwareMonitor"
удалить таблицу
SELECT/WHERE¶
SELECT * FROM performance
отобразить все данные в таблице
SELECT value FROM performance
отфильтровать по столбцу value (только Field Keys)
SELECT * FROM performance limit 10
отобразить 10 единиц данных
SELECT * FROM performance WHERE time > now() -2d
отобразить данные за последние 2 дня
SELECT * FROM performance WHERE time > now() +3h -5m
данные за последние 5 минут (+3 часа от текущего времени по UTC 0 -5 минут)
SELECT * FROM performance WHERE counter = 'CPU'
выборка по тэгу
SELECT upload/1000 FROM speedtest WHERE upload/1000 <= 250
выборка по столбцу upload и разделить вывод на 1000, вывести upload меньше 250
DELETE FROM performance WHERE time > now() -1h
удалить данные за последние 1/4 часа
DELETE FROM performance WHERE time < now() -24h
удалить данные старше 24 часов
REGEX¶
SELECT * FROM "win_pdisk" WHERE instance =~/.*C:/ and time > now() - 5m
и
SELECT * FROM "win_pdisk" WHERE instance =~/.*E:/ or instance =~ /.*F:/
или
SELECT * FROM "win_pdisk" WHERE instance !~ /.*Total/
не равно (исключить)
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel/
приблизительно равно
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel.+i7/
эквивалент 12th_Gen_Intel_Core_i7-1260P
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /^Intel/
начинается на Intel
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /00$/
заканчивается на 00
GROUP BY tag_key¶
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY HardwareName
создать уникальные группы по тэгу HardwareName
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY Host,HardwareName
больше групп по двум тэгаам
Functions(field_key)¶
SELECT instance,LAST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
отфильтровать вывод по последнему/текущему значению
SELECT instance,FIRST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
отфильтровать вывод по первому значению за весь или указанный отрезок времени
SELECT instance,MIN(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
отфильтровать вывод с отображением минимального значения
SELECT instance,MAX(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance
отфильтровать вывод с отображением максимального значения
SELECT SUM(Bytes_Received_persec) FROM "win_net" GROUP BY instance
суммах всех значений
SELECT COUNT(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec >= 0 GROUP BY instance
кол-во данных, где значение выше или равно 0
SELECT MEAN(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec < 1000 GROUP BY instance
среднее значение данных с показателем от 0 до 1000 (509)
SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h GROUP BY SensorName,Host
создать группы для выявления максимального значения значения стобца Value каждого тэга SensorName и хоста за последний час
SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host
масимальное значение CPU_Package за последний час для каждого хоста
SELECT MEAN(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host
среднее значение CPU_Package за последний час
POLICY¶
CREATE DATABASE powershell WITH DURATION 48h REPLICATION 1 NAME "del2d"
создать БД с политикой хранения 2 дня
CREATE RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1
создать новую политику хранения для БД
CREATE RETENTION POLICY del6h ON powershell DURATION 6h REPLICATION 1 SHARD DURATION 2h
указать период хранения 6 часов + 2 часа до очистки (по умолчанию 1ч или больше)
ALTER RETENTION POLICY del6h ON powershell DEFAULT
изменить (ALTER) политику хранения для БД на del6h (DEFAULT)
DROP RETENTION POLICY del2d ON powershell
удаление политики хранения приводит к безвозвратному удалению всех измерений (таблиц) и данных, хранящихся в политике хранения
SHOW RETENTION POLICIES ON PowerShell
отобразить действующие политики базы данных PowerShell
$data = Invoke-RestMethod http://192.168.3.102:8086/query?q="SHOW RETENTION POLICIES ON PowerShell"
$col = $data.results.series.columns
$val = $data.results.series.values
$mass = @()
$mass += [string]$col
foreach ($v in $val) {
$mass += [string]$v
}
$mass = $mass -replace '^','"'
$mass = $mass -replace '$','"'
$mass = $mass -replace '\s','","'
$mass | ConvertFrom-Csv
API POST¶
Вместо таблиц в InfluxDB имеются измерения. Вместо столбцов в ней есть теги и поля.
Table Tag (string/int) Field (double/int) TIMESTAMP
measurement,Tag_Keys1=Tag_Values1,Tag_Keys2=Tag_Values2 Field_Keys1="Values",Field_Keys2="Values" 0000000000000000000
1 2 3
$ip = "192.168.3.104"
$port = "8086"
$db = "powershell"
$table = "speedtest"
$ipp = $ip+":"+$port
$url = "http://$ipp/write?db=$db"
$user = "admin"
$pass = "password" | ConvertTo-SecureString -AsPlainText -Force
$cred = [System.Management.Automation.PSCredential]::new($user,$pass)
$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
Invoke-RestMethod -Method POST -Uri $url -Body "$table,host=$(hostname) download=200000,upload=300000,ping=3 $timestamp"
API GET¶
curl http://192.168.3.104:8086/query --data-urlencode "q=SHOW DATABASES"
pwsh7 (ConvertFrom-Json) and bash
$dbs = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES"
$dbs = irm "http://192.168.3.104:8086/query?epoch=ms&u=admin&p=password&q=SHOW DATABASES"
$dbs.results.series.values
$ip = "192.168.3.104"
$port = "8086"
$db = "powershell"
$table = "speedtest"
$query = "SELECT * FROM $table"
$ipp = $ip+":"+$port
$url = "http://$ipp/query?db=$db&q=$query"
$data = Invoke-RestMethod -Method GET -Uri $url` -Credential $cred
$data.results.series.name ` имя таблицы
$data.results.series.columns` столбцы/ключи
$data.results.series.values ` данные построчно
Endpoints¶
$stats = irm http://192.168.3.104:8086/debug/vars` статистика сервера
$stats."database:powershell".values` кол-во таблиц к БД
$stats.queryExecutor.values` количество query-запросов (обращений к endpoint /query)
$stats.write.values` количество write-запросов
$stats.system.uptime
http://192.168.3.104:8086/debug/requests
кол-во клиентских HTTP-запросов к конечным точкам /writeи /query
http://192.168.3.104:8086/debug/pprof
http://192.168.3.104:8086/ping
http://192.168.3.104:8086/query
http://192.168.3.104:8086/write
http://192.168.3.99:8086/api/v2/setup
http://192.168.3.99:8086/api/v2/config
http://192.168.3.99:8086/api/v2/write
PingTo-InfluxDB¶
while ($true) {
$tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds` -3h UTC
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
$tnc = tnc 8.8.8.8
$Status = $tnc.PingSucceeded
$RTime = $tnc.PingReplyDetails.RoundtripTime
Invoke-RestMethod -Method POST -Uri "http://192.168.3.104:8086/write?db=powershell" -Body "ping,host=$(hostname) status=$status,rtime=$RTime $timestamp"
sleep 1
}
SELECT * FROM ping WHERE status = false
PerformanceTo-InfluxDB¶
function ConvertTo-Encoding ([string]$From, [string]$To) {
Begin {
$encFrom = [System.Text.Encoding]::GetEncoding($from)
$encTo = [System.Text.Encoding]::GetEncoding($to)
}
Process {
$bytes = $encTo.GetBytes($_)
$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
$encTo.GetString($bytes)
}
}
$localization = (Get-Culture).LCID` текущая локализация
if ($localization -eq 1049) {
$performance = "\\$(hostname)\Процессор(_Total)\% загруженности процессора" | ConvertTo-Encoding UTF-8 windows-1251` декодировать кириллицу
} else {
$performance = "\Processor(_Total)\% Processor Time"
}
$tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
while ($true) {
$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds` -3h UTC
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
[double]$value = (Get-Counter $performance).CounterSamples.CookedValue.ToString("0.00").replace(",",".")` округлить в тип данных Double
Invoke-RestMethod -Method POST -Uri "http://192.168.3.104:8086/write?db=powershell" -Body "performance,host=$(hostname),counter=CPU value=$value $timestamp"
sleep 5
}
Service¶
$powershell_Path = (Get-Command powershell).Source
$NSSM_Path = "C:\NSSM\NSSM-2.24.exe"
$Script_Path = "C:\NSSM\PerformanceTo-InfluxDB.ps1"
$Service_Name = "PerformanceTo-InfluxDB"
& $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path
Get-Service $Service_Name | Start-Service
Get-Service $Service_Name | Set-Service -StartupType Automatic
Telegraf¶
iwr https://dl.influxdata.com/telegraf/releases/telegraf-1.27.1_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.27.1_windows_amd64.zip
Expand-Archive .\telegraf-1.27.1_windows_amd64.zip -DestinationPath "C:\Telegraf"
rm telegraf-1.27.1_windows_amd64.zip
cd C:\Telegraf
.\telegraf.exe -sample-config --input-filter cpu:mem:dns_query --output-filter influxdb > telegraf_nt.conf
создать конфигурацию с выбарнными плагинами для сбора метрик
Start-Process notepad++ C:\Telegraf\telegraf_nt.conf
[[outputs.influxdb]]
urls = ["http://192.168.3.104:8086"]
database = "telegraf_nt"
username = "user"
password = "pass"
[[inputs.cpu]]
percpu = false
totalcpu = true
[[inputs.dns_query]]
servers = ["8.8.8.8"]
network = "udp"
domains = ["."]
record_type = "A"
port = 53
timeout = "2s"
.\telegraf.exe --test -config C:\Telegraf\telegraf_nt.conf
тест конфигурации (получения метрик с выводом в консоль)
C:\Telegraf\telegraf.exe -config C:\Telegraf\telegraf_nt.conf
запустить telegraf (тест отправки данных)
.\telegraf.exe --config "C:\Telegraf\telegraf_nt.conf" --service install
создать службу
Get-Service telegraf | Start-Service
.\telegraf.exe --service uninstall
USE telegraf
SELECT usage_idle,usage_system,usage_user FROM cpu