Skip to content

Commit

Permalink
Merge pull request #3739 from vyos/mergify/bp/circinus/pr-3720
Browse files Browse the repository at this point in the history
T6477: Add telegraf loki output plugin (backport #3720)
  • Loading branch information
dmbaturin authored Jun 28, 2024
2 parents 2c4e778 + 362a810 commit 551dfa5
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 1 deletion.
15 changes: 15 additions & 0 deletions data/templates/telegraf/telegraf.j2
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,21 @@
bucket = "{{ influxdb.bucket }}"
### End InfluxDB2 ###
{% endif %}
{% if loki is vyos_defined %}
### Loki ###
[[outputs.loki]]
## The domain of Loki
domain = "{{ loki.url }}:{{ loki.port }}"
{% if loki.authentication.username is vyos_defined and loki.authentication.password is vyos_defined %}
## Basic Authentication
username = "{{ loki.authentication.username }}"
password = "{{ loki.authentication.password }}"
{% endif %}
{% if loki.metric_name_label is vyos_defined %}
metric_name_label = "{{ loki.metric_name_label }}"
{% endif %}
### End Loki ###
{% endif %}
{% if prometheus_client is vyos_defined %}
### Prometheus ###
[[outputs.prometheus_client]]
Expand Down
33 changes: 33 additions & 0 deletions interface-definitions/service_monitoring_telegraf.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,39 @@
#include <include/url-http-https.xml.i>
</children>
</node>
<node name="loki">
<properties>
<help>Output plugin Loki</help>
</properties>
<children>
<node name="authentication">
<properties>
<help>HTTP basic authentication parameters</help>
</properties>
<children>
#include <include/generic-username.xml.i>
#include <include/generic-password.xml.i>
</children>
</node>
<leafNode name="metric-name-label">
<properties>
<help>Metric name label</help>
<valueHelp>
<format>txt</format>
<description>Label to use for the metric name</description>
</valueHelp>
<constraint>
#include <include/constraint/alpha-numeric-hyphen-underscore-dot.xml.i>
</constraint>
</properties>
</leafNode>
#include <include/port-number.xml.i>
<leafNode name="port">
<defaultValue>3100</defaultValue>
</leafNode>
#include <include/url-http-https.xml.i>
</children>
</node>
<leafNode name="source">
<properties>
<help>Source parameters for monitoring</help>
Expand Down
29 changes: 29 additions & 0 deletions smoketest/scripts/cli/test_service_monitoring_telegraf.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import unittest

from base_vyostest_shim import VyOSUnitTestSHIM
from vyos.configsession import ConfigSessionError

from vyos.utils.process import process_named_running
from vyos.utils.file import read_file
Expand Down Expand Up @@ -63,5 +64,33 @@ def test_01_basic_config(self):
for input in inputs:
self.assertIn(input, config)

def test_02_loki(self):
label = 'r123'
loki_url = 'http://localhost'
port = '3100'
loki_username = 'VyOS'
loki_password = 'PassW0Rd_VyOS'

self.cli_set(base_path + ['loki', 'url', loki_url])
self.cli_set(base_path + ['loki', 'port', port])
self.cli_set(base_path + ['loki', 'metric-name-label', label])

self.cli_set(base_path + ['loki', 'authentication', 'username', loki_username])
# password not set
with self.assertRaises(ConfigSessionError):
self.cli_commit()
self.cli_set(base_path + ['loki', 'authentication', 'password', loki_password])

# commit changes
self.cli_commit()

config = read_file(TELEGRAF_CONF)
self.assertIn(f'[[outputs.loki]]', config)
self.assertIn(f'domain = "{loki_url}:{port}"', config)
self.assertIn(f'metric_name_label = "{label}"', config)
self.assertIn(f'username = "{loki_username}"', config)
self.assertIn(f'password = "{loki_password}"', config)


if __name__ == '__main__':
unittest.main(verbosity=2)
18 changes: 17 additions & 1 deletion src/conf_mode/service_monitoring_telegraf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
# Copyright (C) 2021-2023 VyOS maintainers and contributors
# Copyright (C) 2021-2024 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
Expand Down Expand Up @@ -113,6 +113,9 @@ def get_config(config=None):
if not conf.exists(base + ['azure-data-explorer']):
del monitoring['azure_data_explorer']

if not conf.exists(base + ['loki']):
del monitoring['loki']

return monitoring

def verify(monitoring):
Expand Down Expand Up @@ -159,6 +162,19 @@ def verify(monitoring):
if 'url' not in monitoring['splunk']:
raise ConfigError(f'Monitoring splunk "url" is mandatory!')

# Verify Loki
if 'loki' in monitoring:
if 'url' not in monitoring['loki']:
raise ConfigError(f'Monitoring loki "url" is mandatory!')
if 'authentication' in monitoring['loki']:
if (
'username' not in monitoring['loki']['authentication']
or 'password' not in monitoring['loki']['authentication']
):
raise ConfigError(
f'Authentication "username" and "password" are mandatory!'
)

return None

def generate(monitoring):
Expand Down

0 comments on commit 551dfa5

Please sign in to comment.