Skip to content

Commit

Permalink
feat: add extraExporters to logs (#3711)
Browse files Browse the repository at this point in the history
* feat: add extraExporters to logs

Signed-off-by: Dominik Rosiek <[email protected]>

* feat: add advanced routing for containers log

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: refactor

Signed-off-by: Dominik Rosiek <[email protected]>

* feat: extend feature to systemd and kubelet pipelines

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: refactor

Signed-off-by: Dominik Rosiek <[email protected]>

* feat: add checks to checks.txt

Signed-off-by: Dominik Rosiek <[email protected]>

* test: add more goldenfiles

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: changelog

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: do not try to use non-existing kubelet exporter for http source

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: goldenfiles

Signed-off-by: Dominik Rosiek <[email protected]>

* test: add integration test for extraExporters

Signed-off-by: Dominik Rosiek <[email protected]>

* test: wait for additional sumologic mock

Signed-off-by: Dominik Rosiek <[email protected]>

* test: .

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: .

Signed-off-by: Dominik Rosiek <[email protected]>

* feat: do not print logs by additional sumologic mock

Signed-off-by: Dominik Rosiek <[email protected]>

* feat: disable logging in additional sumologic mock

Signed-off-by: Dominik Rosiek <[email protected]>

* test: add integration test for partial routing

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: fix due to integration tests

Signed-off-by: Dominik Rosiek <[email protected]>

* test: add test for splitted routing

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: fix config

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: refactor logs tests

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: rename exactValue to strict

Signed-off-by: Dominik Rosiek <[email protected]>

* chore: fix typo

Signed-off-by: Dominik Rosiek <[email protected]>

* Update deploy/helm/sumologic/values.yaml

* test(integration): put additional receiver mock in same namespace

---------

Signed-off-by: Dominik Rosiek <[email protected]>
Co-authored-by: Mikołaj Świątek <[email protected]>
  • Loading branch information
sumo-drosiek and swiatekm committed May 28, 2024
1 parent 243d198 commit 38cf193
Show file tree
Hide file tree
Showing 31 changed files with 2,346 additions and 195 deletions.
1 change: 1 addition & 0 deletions .changelog/3711.changed.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
feat: expose additional exporters and routing configuration
3 changes: 3 additions & 0 deletions deploy/helm/sumologic/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ The following table lists the configurable parameters of the Sumo Logic chart an
| `sumologic.logs.container.excludeNamespaceRegex` | A regular expression for Kubernetes namespace names. Logs from pods running in matching namespaces will not be sent to Sumo. | `""` |
| `sumologic.logs.container.excludePodRegex` | A regular expression for pod names. Logs from matching pods will not be sent to Sumo. | `""` |
| `sumologic.logs.container.otelcol.extraProcessors` | Extra processors for container logs. See [Sumo Logic documentation](https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/) for details. | `[]` |
| `sumologic.logs.otelcol.extraExporters` | Extra exporter for logs. See [Sumo Logic documentation](https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/) for details. | `{}` |
| `sumologic.logs.otelcol.routing` | Advanced routing configuration. See [Sumo Logic documentation](https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/) for details. | `{"fallbackExporters": [], "table": []}` |
| `sumologic.logs.otelcol.useDefaultExporters` | Set to `false` to use only `sumologic.logs.otelcol.extraExporters`. See [Sumo Logic documentation](https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/) for details. | `true` |
| `sumologic.logs.container.perContainerAnnotationsEnabled` | Enable container-level pod annotations. | `false` |
| `sumologic.logs.container.perContainerAnnotationPrefixes` | Defines the list of prefixes of container-level pod annotations. | `[]` |
| `sumologic.logs.systemd.sourceName` | Set the \_sourceName metadata field in Sumo Logic. | `"%{_sourceName}"` |
Expand Down
54 changes: 51 additions & 3 deletions deploy/helm/sumologic/conf/logs/otelcol/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@ exporters:
{{- end }}
{{- end }}

{{- if .Values.sumologic.logs.otelcol.extraExporters }}
{{- range $name, $exporter := .Values.sumologic.logs.otelcol.extraExporters }}
{{ printf "%s:" $name | indent 2 }}
{{ toYaml $exporter | indent 4}}
{{- end }}
{{- end }}

extensions:
health_check: {}
{{ if .Values.metadata.persistence.enabled }}
Expand Down Expand Up @@ -372,6 +379,38 @@ processors:
value: ""
{{ end }}

{{- if .Values.sumologic.logs.otelcol.routing.table }}
routing/containers:
default_exporters:
{{ include "logs.otelcol.routing.defaultExporters" (dict "Values" .Values "Type" "containers") | nindent 6}}
table:
{{- range $entry := .Values.sumologic.logs.otelcol.routing.table }}
- statement: {{ $entry.statement }}
exporters:
- {{ $entry.exporter }}
{{- end }}
{{- if .Values.sumologic.logs.otelcol.useDefaultExporters }}
- statement: route()
exporters:
{{ include "logs.otelcol.routing.defaultExporters" (dict "Values" .Values "Type" "containers") | nindent 12}}
{{- end }}

routing/systemd:
default_exporters:
{{ include "logs.otelcol.routing.defaultExporters" (dict "Values" .Values "Type" "systemd") | nindent 6 }}
table:
{{- range $entry := .Values.sumologic.logs.otelcol.routing.table }}
- statement: {{ $entry.statement }}
exporters:
- {{ $entry.exporter }}
{{- end }}
{{- if .Values.sumologic.logs.otelcol.useDefaultExporters }}
- statement: route()
exporters:
{{ include "logs.otelcol.routing.defaultExporters" (dict "Values" .Values "Type" "systemd") | nindent 12 }}
{{- end }}
{{- end }}

{{ if .Values.sumologic.logs.container.enabled }}
source/containers:
annotation_prefix: "pod_annotations_"
Expand Down Expand Up @@ -485,7 +524,7 @@ service:
{{ if .Values.sumologic.logs.container.enabled }}
logs/otlp/containers:
exporters:
{{ include "logs.otelcol.container.exporters" . | indent 8 }}
{{ include "logs.otelcol.exporters" (dict "Values" .Values "Type" "containers") | nindent 8}}
processors:
- memory_limiter
- filter/include_containers
Expand All @@ -511,14 +550,17 @@ service:
- transform/flatten
{{- end }}
- batch
{{- if .Values.sumologic.logs.otelcol.routing.table }}
- routing/containers
{{- end }}
receivers:
- otlp
{{ end }}

{{ if .Values.sumologic.logs.systemd.enabled }}
logs/otlp/kubelet:
exporters:
{{ include "logs.otelcol.kubelet.exporters" . | indent 8 }}
{{ include "logs.otelcol.exporters" (dict "Values" .Values "Type" "systemd") | nindent 8}}
processors:
- memory_limiter
- filter/include_fluent_tag_host
Expand All @@ -541,12 +583,15 @@ service:
{{- end }}
{{- end }}
- batch
{{- if .Values.sumologic.logs.otelcol.routing.table }}
- routing/systemd
{{- end }}
receivers:
- otlp

logs/otlp/systemd:
exporters:
{{ include "logs.otelcol.systemd.exporters" . | indent 8 }}
{{ include "logs.otelcol.exporters" (dict "Values" .Values "Type" "systemd") | nindent 8}}
processors:
- memory_limiter
- filter/include_fluent_tag_host
Expand All @@ -570,6 +615,9 @@ service:
{{- end }}
{{- end }}
- batch
{{- if .Values.sumologic.logs.otelcol.routing.table }}
- routing/systemd
{{- end }}
receivers:
- otlp
{{ end }}
Expand Down
95 changes: 46 additions & 49 deletions deploy/helm/sumologic/templates/_helpers/_logs.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -64,74 +64,71 @@ Return the log format for the Sumologic exporter for container logs.
{{- end -}}

{{/*
Return the exporters for container log pipeline.
Return default exporters for routing processor for .Type pipeline.
'{{ include "logs.otelcol.container.exporters" . }}'
'{{- include "logs.otelcol.routing.defaultExporters" (dict "Values" .Values "Type" "containers") }}'
*/}}
{{- define "logs.otelcol.container.exporters" -}}
{{- if eq .Values.sumologic.logs.sourceType "http" -}}
- sumologic/containers
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" }}
- sumologic/sumologic-mock-containers
{{- end }}
{{- else if eq .Values.sumologic.logs.sourceType "otlp" }}
- sumologic
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" }}
- sumologic/sumologic-mock
{{- end }}
{{- else -}}
{{- fail "`sumologic.logs.sourceType` can only be `http` or `otlp`" -}}
{{- define "logs.otelcol.routing.defaultExporters" -}}
{{- $exporters := include "logs.otelcol.defaultExporters" . | fromJsonArray }}
{{- range $entry := .Values.sumologic.logs.otelcol.routing.fallbackExporters -}}
{{- $exporters = append $exporters $entry -}}
{{- end -}}
{{- if eq .Values.debug.logs.metadata.print true }}
- debug
{{- range $_, $exporter := $exporters }}
{{ printf "- %s" $exporter }}
{{- end }}
{{- end -}}

{{/*
Return the exporters for systemd log pipeline.
Return default exporters for .Type pipeline
'{{ include "logs.otelcol.systemd.exporters" . }}'
'{{- $exporters := include "logs.otelcol.defaultExporters" (dict "Values" .Values "Type" "containers") | fromJsonArray }}'
*/}}
{{- define "logs.otelcol.systemd.exporters" -}}
{{- define "logs.otelcol.defaultExporters" -}}
{{- $exporters := list -}}
{{- if .Values.sumologic.logs.otelcol.useDefaultExporters -}}
{{- if eq .Values.sumologic.logs.sourceType "http" -}}
- sumologic/systemd
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" }}
- sumologic/sumologic-mock-systemd
{{- end }}
{{- else if eq .Values.sumologic.logs.sourceType "otlp" }}
- sumologic
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" }}
- sumologic/sumologic-mock
{{- end }}
{{- $exporters = append $exporters (printf "sumologic/%s" .Type) -}}
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" -}}
{{- $exporters = append $exporters (printf "sumologic/sumologic-mock-%s" .Type) -}}
{{- end -}}
{{- else if eq .Values.sumologic.logs.sourceType "otlp" -}}
{{- $exporters = append $exporters "sumologic" -}}
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" -}}
{{- $exporters = append $exporters "sumologic/sumologic-mock" -}}
{{- end -}}
{{- else -}}
{{- fail "`sumologic.logs.sourceType` can only be `http` or `otlp`" -}}
{{- end -}}
{{- if eq .Values.debug.logs.metadata.print true }}
- debug
{{- end }}
{{- if eq .Values.debug.logs.metadata.print true -}}
{{- $exporters = append $exporters "debug" -}}
{{- end -}}
{{- end -}}
{{ $exporters | uniq | toJson }}
{{- end -}}

{{/*
Return the exporters for kubelet log pipeline.
Return all exporters for .Type pipeline
'{{ include "logs.otelcol.kubelet.exporters" . }}'
'{{- include "logs.otelcol.exporters" (dict "Values" .Values "Type" "containers") }}'
*/}}
{{- define "logs.otelcol.kubelet.exporters" -}}
{{- if eq .Values.sumologic.logs.sourceType "http" }}
- sumologic/systemd
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" }}
- sumologic/sumologic-mock-systemd
{{- end }}
{{- else if eq .Values.sumologic.logs.sourceType "otlp" }}
- sumologic
{{- if eq (include "sumologic-mock.forward-logs-metadata" .) "true" }}
- sumologic/sumologic-mock
{{- end }}
{{- else }}
{{- fail "`sumologic.logs.sourceType` can only be `http` or `otlp`" -}}
{{- define "logs.otelcol.exporters" -}}
{{- $exporters := include "logs.otelcol.defaultExporters" . | fromJsonArray }}
{{/* Iterate over all exporters used by routing */}}
{{- if .Values.sumologic.logs.otelcol.routing.table -}}
{{- range $entry := .Values.sumologic.logs.otelcol.routing.table -}}
{{- $exporters = append $exporters $entry.exporter -}}
{{- end -}}
{{- range $exporter := .Values.sumologic.logs.otelcol.routing.fallbackExporters -}}
{{- $exporters = append $exporters $exporter -}}
{{- end -}}
{{/* Routing is not enabled, so iterate over all extraExporters */}}
{{- else -}}
{{- range $exporter, $_ := .Values.sumologic.logs.otelcol.extraExporters -}}
{{- $exporters = append $exporters $exporter -}}
{{- end -}}
{{- end -}}
{{- if eq .Values.debug.logs.metadata.print true }}
- debug
{{- range $_, $exporter := $exporters }}
{{ printf "- %s" $exporter }}
{{- end }}
{{- end -}}

Expand Down
11 changes: 11 additions & 0 deletions deploy/helm/sumologic/templates/checks.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,14 @@
{{- if and (eq (include "logs.collector.otellogswindows.enabled" .) "true") (has "..." $nameservers) -}}
{{- fail "\nPlease set cluster namserver for windows log collection" -}}
{{- end -}}

{{/* Check if routing has been configured properly */}}
{{- if and .Values.sumologic.logs.otelcol.useDefaultExporters .Values.sumologic.logs.otelcol.routing.fallbackExporters -}}
{{- fail "\nCannot use `sumologic.logs.otelcol.routing.fallbackExporters` when `sumologic.logs.otelcol.useDefaultExporters` is set to `true`: https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/" }}
{{- end -}}
{{- if and (not .Values.sumologic.logs.otelcol.useDefaultExporters) (not .Values.sumologic.logs.otelcol.routing.fallbackExporters) .Values.sumologic.logs.otelcol.routing.table -}}
{{- fail "\nYou have to specify `sumologic.logs.otelcol.routing.fallbackExporters` or set `sumologic.logs.otelcol.useDefaultExporters` to `true` when using `.Values.sumologic.logs.otelcol.routing.table`: https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/" }}
{{- end -}}
{{- if and (not .Values.sumologic.logs.otelcol.useDefaultExporters) (not .Values.sumologic.logs.otelcol.extraExporters) -}}
{{- fail "\nPlease set `sumologic.logs.otelcol.extraExporters` if you set `sumologic.logs.otelcol.useDefaultExporters` to false : https://help.sumologic.com/docs/send-data/kubernetes/collecting-logs/" }}
{{- end -}}
18 changes: 18 additions & 0 deletions deploy/helm/sumologic/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,24 @@ sumologic:
## Matching unit will be excluded from Sumo. The logs will still be sent to logs metadata provider (otelcol).
excludeUnitRegex: ""

otelcol:
## additional exporters which may be used in any of the pipeline
extraExporters: {}
## useDefaultExporters uses default helm chart exporters and always sends all data to them
useDefaultExporters: true
## routing defines how to route data
routing:
## fallbackExporters is a list of exporters to be used when data do not match any of the table's statement
fallbackExporters: []
table: []
## -
## ## exporter is name of the exporter
## exporter: sumologic/otlp
## ## statement is an OTTL condition which defines what data should be send to the exporter
## ## see routing processor documentation for more details:
## ## https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/aee4b75100530bce7edbf736fbcf76ac4f6ced6d/processor/routingprocessor/README.md#tech-preview-opentelemetry-transformation-language-statements-as-routing-conditions
## statement: ""

## Fields to be created at Sumo Logic to ensure logs are tagged with
## relevant metadata.
## https://help.sumologic.com/docs/manage/fields/#manage-fields
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
sumologic:
logs:
collector:
otelcol:
enabled: true
otelcol:
extraExporters:
sumologic/test:
endpoint: https://test-endpoint
debug:
verbosity: detailed
Loading

0 comments on commit 38cf193

Please sign in to comment.