From 0c0de275270f937aaebdbd137bb15dfd768a5b38 Mon Sep 17 00:00:00 2001 From: "Ryan J. Geyer" Date: Thu, 24 Aug 2023 15:04:49 -0700 Subject: [PATCH 1/3] Initial commit of mysql integration module --- modules/grafana-cloud/integrations/README.md | 11 +++ .../integrations/mysql/README.md | 72 +++++++++++++++++++ .../integrations/mysql/module.river | 68 ++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 modules/grafana-cloud/integrations/README.md create mode 100644 modules/grafana-cloud/integrations/mysql/README.md create mode 100644 modules/grafana-cloud/integrations/mysql/module.river diff --git a/modules/grafana-cloud/integrations/README.md b/modules/grafana-cloud/integrations/README.md new file mode 100644 index 0000000..c31f384 --- /dev/null +++ b/modules/grafana-cloud/integrations/README.md @@ -0,0 +1,11 @@ +# Grafana Cloud Integrations + +Module library to apply the opinionated configurations for Grafana Cloud [Integrations](https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/) + +## Design principals + +These modules will *only* apply the opinionated configuration details for a given integration. + +Usually, this means that a module will primarily require arguments for input and output. I.E. `metrics_targets`, `metrics_forward_to`, `logs_targets`, `logs_forward_to`. + +The module consumer will be responsible for discovering the targets, and configuring an end-of-line receiver (usually a remote write component). \ No newline at end of file diff --git a/modules/grafana-cloud/integrations/mysql/README.md b/modules/grafana-cloud/integrations/mysql/README.md new file mode 100644 index 0000000..4a7621a --- /dev/null +++ b/modules/grafana-cloud/integrations/mysql/README.md @@ -0,0 +1,72 @@ +# MySQL integration +Module which performs expected transformations and labeling for the [MySQL integration](https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-mysql/) + +## Usage +Because the instance name is an argument to this module, the module must be re-used for each MySQL instance you wish to observe. + +Some examples can be found below. + +### Multiple instances on the same host + +Note that this is an unrealistic example since the hosts would likely be different, and the log files in the same location on each host. + +``` +module.git "grafana_cloud" { + repository = "https://github.com/grafana/agent-modules.git" + revision = "main" + path = "modules/grafana-cloud/autoconfigure/module.river" + + arguments { + stack_name = "" + token = "" + } +} + +prometheus.exporter.mysql "mysqlprimary" { + data_source_name = ":@(:)/" +} + +loki.source.file "mysqlprimary" { + targets = [ + { __path__ = "/var/log/mysql/mysqlprimary.log" }, + ] + forward_to = [module.file.mysqlprimary.exports.logs_receiver] +} + +module.file "mysqlprimary" { + filename = "/config/modules/grafana-cloud/integrations/mysql/module.river" + + arguments { + instance = "Primary" + metrics_targets = prometheus.exporter.mysql.mysqlprimary.targets + metrics_receiver = [module.file.grafana_cloud.exports.metrics_receiver] + logs_receiver = [module.file.grafana_cloud.exports.logs_receiver] + } +} + +prometheus.exporter.mysql "mysqlsecondary" { + data_source_name = ":@(:)/" +} + +loki.source.file "mysqlsecondary" { + targets = [ + { __path__ = "/var/log/mysql/mysqlsecondary.log" }, + ] + forward_to = [module.file.mysqlsecondary.exports.logs_receiver] +} + +module.file "mysqlsecondary" { + filename = "/config/modules/grafana-cloud/integrations/mysql/module.river" + + arguments { + instance = "Secondary" + metrics_targets = prometheus.exporter.mysql.mysqlsecondary.targets + metrics_receiver = [module.file.grafana_cloud.exports.metrics_receiver] + logs_receiver = [module.file.grafana_cloud.exports.logs_receiver] + } +} +``` + +### Multiple instances with kuberenetes discovery + +Placeholder \ No newline at end of file diff --git a/modules/grafana-cloud/integrations/mysql/module.river b/modules/grafana-cloud/integrations/mysql/module.river new file mode 100644 index 0000000..3235094 --- /dev/null +++ b/modules/grafana-cloud/integrations/mysql/module.river @@ -0,0 +1,68 @@ +/******************************************** + * ARGUMENTS + ********************************************/ +argument "instance" {} + +argument "metrics_targets" {} + +argument "metrics_receiver" {} + +argument "logs_receiver" {} + +/******************************************** + * EXPORTS + ********************************************/ +export "logs_receiver" { + value = loki.relabel.job_instance.receiver +} + +/******************************************** + * Metrics scrape and relabel + ********************************************/ +prometheus.scrape "mysql" { + job_name = "integrations/mysql" + targets = argument.metrics_targets.value + forward_to = [prometheus.relabel.instance.receiver] +} + +prometheus.relabel "instance" { + forward_to = argument.metrics_receiver.value + + rule { + target_label = "instance" + replacement = argument.instance.value + } +} + +/******************************************** + * Logs relabel and pipeline stages + ********************************************/ +loki.relabel "job_instance" { + forward_to = [loki.process.stages.receiver] + rule { + target_label = "instance" + replacement = argument.instance.value + } + rule { + target_label = "job" + replacement = "integrations/mysql" + } +} + +loki.process "stages" { + forward_to = argument.logs_receiver.value + stage.regex { + expression = "(?P.+) (?P[\\d]+) \\[(?P