From 7e0689be0773a792afd9aa3f15092daf85df2e15 Mon Sep 17 00:00:00 2001 From: Andrey Kolkov Date: Thu, 25 Feb 2021 12:43:03 +0400 Subject: [PATCH 1/2] Added log vars: log_pretty_format, set_log_level --- charts/moira/README.md | 3 +++ charts/moira/templates/api-configmap.yaml | 1 + charts/moira/templates/checker-configmap.yaml | 9 +++++++++ charts/moira/templates/filter-configmap.yaml | 1 + charts/moira/templates/notifier-configmap.yaml | 9 +++++++++ charts/moira/values.yaml | 17 +++++++++++++++++ 6 files changed, 40 insertions(+) diff --git a/charts/moira/README.md b/charts/moira/README.md index 1b88604..10e3f73 100644 --- a/charts/moira/README.md +++ b/charts/moira/README.md @@ -114,6 +114,7 @@ Parameter | Description | Default value `microservices.checker.stopCheckingInterval` | Period for every trigger to cancel forced check if no metrics were received | `30s` `microservices.checker.maxParallelChecks` | Max parallel checks number for local triggers | `0` `microservices.checker.maxParallelRemoteChecks` | Max parallel checks number for remote triggers | `0` +`microservices.checker.setLogLevel` | Adjusting minimal log level with concrete fields | `{}` ### Moira Notifier Parameter | Description | Default value @@ -132,6 +133,7 @@ Parameter | Description | Default value `microservices.notifier.moiraSelfState.lastRemoteCheckDelay` | Max Checker checks perform delay for remote triggers | `300s` `microservices.notifier.moiraSelfState.noticeInterval` | Self state monitor alerting interval | `300s` `microservices.notifier.moiraSelfState.contacts` | Moira administrator contacts | `{}` +`microservices.notifier.setLogLevel` | Adjusting minimal log level with concrete fields | `{}` ### Moira API Parameter | Description | Default value @@ -189,6 +191,7 @@ Parameter | Description | Default value --------- | ----------- | ------------- `telemetry.logger.logLevel` | Log level | `info` `telemetry.logger.logFile` | Log file path | `stdout` +`telemetry.logger.logPrettyFormat` | Enable human-readable console output | `false` ### Profiling server Parameter | Description | Default value diff --git a/charts/moira/templates/api-configmap.yaml b/charts/moira/templates/api-configmap.yaml index 889463f..c671f28 100644 --- a/charts/moira/templates/api-configmap.yaml +++ b/charts/moira/templates/api-configmap.yaml @@ -40,6 +40,7 @@ data: logger: log_level: {{ .Values.telemetry.logger.logLevel }} log_file: {{ .Values.telemetry.logger.logFile }} + log_pretty_format: {{ .Values.telemetry.logger.logPrettyFormat }} telemetry: listen: {{ .Values.telemetry.listen }} graphite: diff --git a/charts/moira/templates/checker-configmap.yaml b/charts/moira/templates/checker-configmap.yaml index 7202245..f9e9ae8 100644 --- a/charts/moira/templates/checker-configmap.yaml +++ b/charts/moira/templates/checker-configmap.yaml @@ -15,6 +15,14 @@ data: max_parallel_remote_checks: {{ .Values.microservices.checker.maxParallelRemoteChecks }} nodata_check_interval: {{ .Values.microservices.checker.nodataCheckInterval }} stop_checking_interval: {{ .Values.microservices.checker.stopCheckingInterval }} + set_log_level: + {{- range $key, $value := .Values.microservices.checker.setLogLevel }} + - {{ $key }}: + {{- range $elem, $elemVal := $value }} + - id: {{ $elemVal.id | quote }} + level: {{ $elemVal.level | quote }} + {{- end }} + {{- end }} redis: master_name: {{ .Values.datasources.redis.masterName }} sentinel_addrs: {{ .Values.datasources.redis.sentinelAddrs }} @@ -35,6 +43,7 @@ data: logger: log_level: {{ .Values.telemetry.logger.logLevel }} log_file: {{ .Values.telemetry.logger.logFile }} + log_pretty_format: {{ .Values.telemetry.logger.logPrettyFormat }} telemetry: listen: {{ .Values.telemetry.listen }} graphite: diff --git a/charts/moira/templates/filter-configmap.yaml b/charts/moira/templates/filter-configmap.yaml index 5e8be55..a0bc00f 100644 --- a/charts/moira/templates/filter-configmap.yaml +++ b/charts/moira/templates/filter-configmap.yaml @@ -25,6 +25,7 @@ data: logger: log_level: {{ .Values.telemetry.logger.logLevel }} log_file: {{ .Values.telemetry.logger.logFile }} + log_pretty_format: {{ .Values.telemetry.logger.logPrettyFormat }} telemetry: listen: {{ .Values.telemetry.listen }} graphite: diff --git a/charts/moira/templates/notifier-configmap.yaml b/charts/moira/templates/notifier-configmap.yaml index ba6bdb5..689e363 100644 --- a/charts/moira/templates/notifier-configmap.yaml +++ b/charts/moira/templates/notifier-configmap.yaml @@ -36,6 +36,14 @@ data: {{ $elem }}: {{ $elemVal | quote }} {{- end }} {{- end }} + set_log_level: + {{- range $key, $value := .Values.microservices.notifier.setLogLevel }} + - {{ $key }}: + {{- range $elem, $elemVal := $value }} + - id: {{ $elemVal.id | quote }} + level: {{ $elemVal.level | quote }} + {{- end }} + {{- end }} redis: master_name: {{ .Values.datasources.redis.masterName }} sentinel_addrs: {{ .Values.datasources.redis.sentinelAddrs }} @@ -56,6 +64,7 @@ data: logger: log_level: {{ .Values.telemetry.logger.logLevel }} log_file: {{ .Values.telemetry.logger.logFile }} + log_pretty_format: {{ .Values.telemetry.logger.logPrettyFormat }} telemetry: listen: {{ .Values.telemetry.listen }} graphite: diff --git a/charts/moira/values.yaml b/charts/moira/values.yaml index a4f963c..09dfae6 100644 --- a/charts/moira/values.yaml +++ b/charts/moira/values.yaml @@ -72,6 +72,12 @@ microservices: # Is related with remote triggers (see remote section) # Equals to the number of processor cores found on Moira host by default or when variable is defined as 0 maxParallelRemoteChecks: 0 + # Adjusting minimal log level with concrete fields + # setLogLevel: + # triggers: + # - id: "111" + # level: "debug" + setLogLevel: {} notifier: # Soft timeout to start retrying to send notification after single failed attempt senderTimeout: "10s" @@ -121,6 +127,15 @@ microservices: # type: telegram # value: Moira Selfstate contacts: {} + # Adjusting minimal log level with concrete fields + # setLogLevel: + # triggers: + # - id: "111" + # level: "debug" + # subscriptions: + # - id: "999" + # level: "warn" + setLogLevel: {} api: # API local network address. Default is ':8081' so api will be available at http://moira.company.com:8081/api listen: ":8081" @@ -210,6 +225,8 @@ telemetry: logLevel: "info" # Log file path logFile: "stdout" + # Enable human-readable console output + logPrettyFormat: false # Profiling server pprof: # If true, profiling server will be enabled From ca4fb21779cc48a337517fd34ca3fe42979e2ffd Mon Sep 17 00:00:00 2001 From: Andrey Kolkov Date: Thu, 25 Feb 2021 12:57:54 +0400 Subject: [PATCH 2/2] chart packing --- docs/index.yaml | 6 +++--- docs/moira-2.6.0.tgz | Bin 8630 -> 8873 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.yaml b/docs/index.yaml index 78d6376..bf08b93 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -2,9 +2,9 @@ apiVersion: v1 entries: moira: - apiVersion: v1 - created: "2020-05-23T20:30:44.0950045+05:00" + created: "2021-02-25T12:57:16.092297188+04:00" description: Moira is a real-time alerting tool, based on Graphite data. - digest: 83fdd19ff2262b593614139a58604823365cac840748deda53d8a6bf16bc0c66 + digest: ab776baf9ac89ad70a00b552fb2f0a8e872dd0999404e1388b2ad86426d3962b home: https://moira.readthedocs.io icon: https://avatars1.githubusercontent.com/u/15890491 keywords: @@ -25,4 +25,4 @@ entries: urls: - https://moira-alert.github.io/helmcharts/moira-2.6.0.tgz version: 2.6.0 -generated: "2020-05-23T20:30:44.0919692+05:00" +generated: "2021-02-25T12:57:16.089383919+04:00" diff --git a/docs/moira-2.6.0.tgz b/docs/moira-2.6.0.tgz index 6fe33f43c6e467ef0ad0b5cbf8e3637157973882..c7a3c76d34d85c83989dd5c3771eeaac9b8a3e45 100644 GIT binary patch literal 8873 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 ra-|6n`?7@mg|2400960!1rB_0NMZmqs@zS literal 8630 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 IumIEm04Pu&V*mgE