Skip to content

InfluxDB

Install Windows

Download InfluxDB 1.x Open Source

InfluxDB-Studio

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

Download

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)

Functions

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

API doc

$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

Plugins

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