Skip to content

Commit

Permalink
Wip
Browse files Browse the repository at this point in the history
Signed-off-by: Pete Wall <[email protected]>
  • Loading branch information
petewall committed Feb 4, 2025
1 parent 54098b2 commit 3471db8
Show file tree
Hide file tree
Showing 81 changed files with 7,834 additions and 2,189 deletions.
50 changes: 39 additions & 11 deletions charts/k8s-monitoring/charts/feature-pod-logs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,6 @@ Be sure perform actual integration testing in a live environment in the main [k8
| staticLabels | object | `{}` | Log labels to set with static values. |
| staticLabelsFrom | object | `{}` | Log labels to set with static values, not quoted so it can reference config components. |

### Pod Discovery

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| excludeNamespaces | list | `[]` | Do not capture logs from any pods in these namespaces. |
| extraDiscoveryRules | string | `""` | Rules to filter pods for log gathering. Only used for "volumes" or "kubernetesApi" gather methods. |
| gatherMethod | string | `"volumes"` | The method to gather pod logs. Options are "volumes", "kubernetesApi", "OpenShiftClusterLogForwarder" (experimental). |
| namespaces | list | `[]` | Only capture logs from pods in these namespaces (`[]` means all namespaces). |

### General settings

| Key | Type | Default | Description |
Expand All @@ -69,14 +60,51 @@ Be sure perform actual integration testing in a live environment in the main [k8
|-----|------|---------|-------------|
| global.platform | string | `""` | The specific platform for this cluster. Will enable compatibility for some platforms. Supported options: (empty) or "openshift". |

### Kubernetes API Gathering: Discovery

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| kubernetesApiGathering.excludeNamespaces | list | `[]` | Do not capture logs from any pods in these namespaces. |
| kubernetesApiGathering.extraDiscoveryRules | string | `""` | Rules to filter pods for log gathering. |
| kubernetesApiGathering.fieldSelectors | list | `[]` | Discover Pods based on field selectors. |
| kubernetesApiGathering.labelSelectors | object | `{}` | Discover Pods based on label selectors. |
| kubernetesApiGathering.namespaces | list | `[]` | Only capture logs from pods in these namespaces (`[]` means all namespaces). |
| kubernetesApiGathering.nodeFieldSelectors | list | `[]` | Discover Pods based on Node field selectors. |
| kubernetesApiGathering.nodeLabelSelectors | object | `{}` | Discover Pods based on Node label selectors. |
| kubernetesApiGathering.nodes | list | `[]` | Do not capture logs from any pods in these namespaces. |
| volumeGathering.nodeFieldSelectors | list | `[]` | Discover Pods based on Node field selectors. |
| volumeGathering.nodeLabelSelectors | object | `{}` | Discover Pods based on Node label selectors. |

### Processing settings

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| structuredMetadata | object | `{}` | The structured metadata mappings to set. To not set any structured metadata, set this to an empty object (e.g. `{}`) Format: `<key>: <extracted_key>`. Example: structuredMetadata: component: component kind: kind name: name |

### Volume Log Gathering
### Volume Gathering: Discovery

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| volumeGathering.excludeNamespaces | list | `[]` | Do not capture logs from any pods in these namespaces. |
| volumeGathering.extraDiscoveryRules | string | `""` | Rules to filter pods for log gathering. |
| volumeGathering.fieldSelectors | list | `[]` | Discover Pods based on field selectors. |
| volumeGathering.labelSelectors | object | `{}` | Discover Pods based on label selectors. |
| volumeGathering.namespaces | list | `[]` | Only capture logs from pods in these namespaces (`[]` means all namespaces). |
| volumeGathering.podLogsPath | string | `"/var/log/pods"` | Path on the Kubernetes nodes where the Pod logs are stored. |

### Volume Gathering: Gathering

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| volumeGathering.onlyGatherNewLogLines | bool | `false` | Only gather new log lines since this was deployed. Do not gather historical log lines. |

### Other Values

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| volumeGatherSettings.onlyGatherNewLogLines | bool | `false` | Only gather new log lines since this was deployed. Do not gather historical log lines. |
| kubernetesApiGathering.enabled | bool | `false` | Only capture logs from pods in these namespaces (`[]` means all namespaces). |
| lokiReceiver.enabled | bool | `false` | Enable receiving logs using the Loki protocol. |
| lokiReceiver.openShiftClusterLogForwarder.enabled | bool | `false` | |
| lokiReceiver.openShiftClusterLogForwarder.namespaces | list | `[]` | |
| lokiReceiver.port | int | `3100` | The port to listen on for logs. |
| volumeGathering.enabled | bool | `true` | |
Original file line number Diff line number Diff line change
@@ -1,30 +1,46 @@
{{- define "feature.podLogs.kubernetesApi.alloy" }}
{{- $labelSelectors := list }}
{{- range $k, $v := .Values.kubernetesApiGathering.labelSelectors }}
{{- if kindIs "slice" $v }}
{{- $labelSelectors = append $labelSelectors (printf "%s in (%s)" $k (join "," $v)) }}
{{- else }}
{{- $labelSelectors = append $labelSelectors (printf "%s=%s" $k $v) }}
{{- end }}
{{- end }}
{{- $nodeLabelSelectors := list }}
{{- range $k, $v := .Values.kubernetesApiGathering.nodeLabelSelectors }}
{{- if kindIs "slice" $v }}
{{- $nodeLabelSelectors = append $nodeLabelSelectors (printf "%s in (%s)" $k (join "," $v)) }}
{{- else }}
{{- $nodeLabelSelectors = append $nodeLabelSelectors (printf "%s=%s" $k $v) }}
{{- end }}
{{- end }}
discovery.kubernetes "kubernetes_api_pods" {
role = "pod"
{{- if .Values.kubernetesApiGathering.namespaces }}
namespaces {
names = {{ .Values.namespaces | toJson }}
}
{{- end }}
{{- if or .Values.kubernetesApiGathering.labelSelectors .Values.kubernetesApiGathering.fieldSelectors }}
{{- if or $labelSelectors .Values.kubernetesApiGathering.fieldSelectors }}
selectors {
role = "pod"
{{- if .Values.kubernetesApiGathering.labelSelectors }}
label = {{ .Values.kubernetesApiGathering.labelSelectors | toJson }}
{{- if $labelSelectors }}
label = {{ $labelSelectors | join "," | quote }}
{{- end }}
{{- if .Values.kubernetesApiGathering.fieldSelectors }}
field = {{ .Values.kubernetesApiGathering.fieldSelectors | join "," | quote }}
{{- end }}
}
{{- end }}
{{- if or .Values.kubernetesApiGathering.nodeLabelSelectors .Values.kubernetesApiGathering.nodeFieldSelectors }}
{{- if or $nodeLabelSelectors .Values.kubernetesApiGathering.nodeFieldSelectors }}
attach_metadata {
node = true
}
selectors {
role = "node"
{{- if .Values.kubernetesApiGathering.nodeLabelSelectors }}
label = {{ .Values.kubernetesApiGathering.nodeLabelSelectors | toJson }}
{{- if $nodeLabelSelectors }}
label = {{ $nodeLabelSelectors | join "," | quote }}
{{- end }}
{{- if .Values.kubernetesApiGathering.nodeFieldSelectors }}
field = {{ .Values.kubernetesApiGathering.nodeFieldSelectors | join "," | quote }}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{{/* Validates that the Alloy instance is appropriate for the given Pod Logs settings */}}
{{/* Inputs: Values (Pod Logs values), Collector (Alloy values), CollectorName (string) */}}
{{- define "feature.podLogs.collector.validate" -}}
{{- if or .Values.volumeGathering.enabled (eq .Values.gatherMethod "volumes") }}
{{- if or (and .Values.volumeGathering.enabled (not .Values.gatherMethod)) (eq .Values.gatherMethod "volumes") }}
{{- if not (eq .Collector.controller.type "daemonset") }}
{{- fail (printf "Pod Logs feature requires Alloy to be a DaemonSet when using the \"volumes\" gather method.\nPlease set:\n%s:\n controller:\n type: daemonset" .CollectorName) }}
{{- end -}}
Expand All @@ -10,7 +10,7 @@
{{- end -}}
{{- end -}}

{{- if or .Values.kubernetesApiGathering.enabled (eq .Values.gatherMethod "kubernetesApi") }}
{{- if or (and .Values.kubernetesApiGathering.enabled (not .Values.gatherMethod)) (eq .Values.gatherMethod "kubernetesApi") }}
{{- if not .Collector.alloy.clustering.enabled }}
{{- if eq .Collector.controller.type "daemonset" }}
{{- fail (printf "Pod Logs feature requires Alloy DaemonSet to be in clustering mode when using the \"kubernetesApi\" gather method.\nPlease set:\n%s:\n alloy:\n clustering:\n enabled: true" .CollectorName) }}
Expand All @@ -19,12 +19,23 @@
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}

{{- if .Values.lokiReceiver.enabled }}
{{- if not .Collector.alloy.clustering.enabled }}
{{- fail (printf "Pod Logs feature requires Alloy to be in clustering mode when using the \"kubernetesApi\" gather method.\nPlease set:\n%s:\n alloy:\n clustering:\n enabled: true" .CollectorName) }}
{{- define "feature.podLogs.validate" -}}
{{/*Validate that if both volume gathering and k8s api gathering, there are some selectors set*/}}
{{- if and .Values.volumeGathering.enabled .Values.kubernetesApiGathering.enabled }}
{{- if not (or .Values.kubernetesApiGathering.labelSelectors .Values.kubernetesApiGathering.fieldSelectors .Values.kubernetesApiGathering.nodeLabelSelectors .Values.kubernetesApiGathering.nodeFieldSelectors)}}
{{- $msg := list "" "When gathering Pod logs by Volumes and the Kubernetes API, you must set selectors to targets pods not covered by the Collector DaemonSet." }}
{{- $msg = append $msg "Please set at least one of:" }}
{{- $msg = append $msg "podLogs:" }}
{{- $msg = append $msg " kubernetesApiGathering:" }}
{{- $msg = append $msg " fieldSelectors: [<field selector>]" }}
{{- $msg = append $msg " labelSelectors:" }}
{{- $msg = append $msg " <Kubernetes Pod Label>: <value> OR [<value1>, <value2>]" }}
{{- $msg = append $msg " nodeFieldSelectors: [<field selector>]" }}
{{- $msg = append $msg " nodeLabelSelectors:" }}
{{- $msg = append $msg " <Kubernetes Node Label>: <value> OR [<value1>, <value2>]" }}
{{- $errorMessage := join "\n" $msg }}
{{- end -}}
{{- end -}}


{{- end -}}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,25 @@ Gather logs from Kubernetes Pods

{{- define "feature.podLogs.notes.actions" }}{{- end }}

{{- define "feature.podLogs.notes.deprecations" }}
{{- if .Values.gatherMethod }}
* The `gatherMethod` value is deprecated and will be removed in a future release.
Please enable the desired Pod log gathering methods individually:
volumeGathering:
enabled: true
kubernetesApiGathering:
enabled: true
lokiReceiver:
enabled: true
{{- end }}
{{- end }}

{{- define "feature.podLogs.summary" -}}
{{- $methods := list }}
{{- if .Values.volumeGathering.enabled }}{{- $methods = append $methods "volumes" }}{{ end }}
{{- if .Values.kubernetesApiGathering.enabled }}{{- $methods = append $methods "kubernetesApi" }}{{ end }}
{{- if .Values.lokiReceiver.enabled }}{{- $methods = append $methods "lokiReceiver" }}{{ end }}
{{- if .Values.lokiReceiver.openShiftClusterLogForwarder.enabled }}{{- $methods = append $methods "OSClusterLogForwarder" }}{{ end }}
version: {{ .Chart.Version }}
method: {{ .Values.gatherMethod }}
methods: {{ $methods | join "," }}
{{- end }}
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
{{- define "feature.podLogs.volumeGathering.alloy" }}
{{- $labelSelectors := list }}
{{- range $k, $v := .Values.volumeGathering.labelSelectors }}
{{- if kindIs "slice" $v }}
{{- $labelSelectors = append $labelSelectors (printf "%s in (%s)" $k (join "," $v)) }}
{{- else }}
{{- $labelSelectors = append $labelSelectors (printf "%s=%s" $k $v) }}
{{- end }}
{{- end }}
{{- $nodeLabelSelectors := list }}
{{- range $k, $v := .Values.volumeGathering.nodeLabelSelectors }}
{{- if kindIs "slice" $v }}
{{- $nodeLabelSelectors = append $nodeLabelSelectors (printf "%s in (%s)" $k (join "," $v)) }}
{{- else }}
{{- $nodeLabelSelectors = append $nodeLabelSelectors (printf "%s=%s" $k $v) }}
{{- end }}
{{- end }}
discovery.kubernetes "volume_gathering_pods" {
role = "pod"
selectors {
Expand All @@ -10,25 +26,25 @@ discovery.kubernetes "volume_gathering_pods" {
names = {{ .Values.namespaces | toJson }}
}
{{- end }}
{{- if or .Values.volumeGathering.labelSelectors .Values.volumeGathering.fieldSelectors }}
{{- if or $labelSelectors .Values.volumeGathering.fieldSelectors }}
selectors {
role = "pod"
{{- if .Values.volumeGathering.labelSelectors }}
label = {{ .Values.volumeGathering.labelSelectors | toJson }}
{{- if $labelSelectors }}
label = {{ $labelSelectors | join "," | quote }}
{{- end }}
{{- if .Values.volumeGathering.fieldSelectors }}
field = {{ .Values.volumeGathering.fieldSelectors | join "," | quote }}
{{- end }}
}
{{- end }}
{{- if or .Values.volumeGathering.nodeLabelSelectors .Values.volumeGathering.nodeFieldSelectors }}
{{- if or $nodeLabelSelectors .Values.volumeGathering.nodeFieldSelectors }}
attach_metadata {
node = true
}
selectors {
role = "node"
{{- if .Values.volumeGathering.nodeLabelSelectors }}
label = {{ .Values.volumeGathering.nodeLabelSelectors | toJson }}
{{- if $nodeLabelSelectors }}
label = {{ $nodeLabelSelectors | join "," | quote }}
{{- end }}
{{- if .Values.volumeGathering.nodeFieldSelectors }}
field = {{ .Values.volumeGathering.nodeFieldSelectors | join "," | quote }}
Expand Down Expand Up @@ -173,8 +189,8 @@ local.file_match "volume_gathering_pods" {

loki.source.file "volume_gathering_pods" {
targets = local.file_match.volume_gathering_pods.targets
{{- if .Values.volumeGathering.onlyGatherNewLogLines | default .Values.volumeGatherSettings.onlyGatherNewLogLines }}
tail_from_end = {{ .Values.volumeGathering.onlyGatherNewLogLines | default .Values.volumeGatherSettings.onlyGatherNewLogLines }}
{{- if .Values.volumeGathering.onlyGatherNewLogLines | default (dig "volumeGatherSettings" "onlyGatherNewLogLines" false .Values) }}
tail_from_end = {{ .Values.volumeGathering.onlyGatherNewLogLines | default (dig "volumeGatherSettings" "onlyGatherNewLogLines" false .Values) }}
{{- end }}
forward_to = [loki.process.pod_log_processor.receiver]
}
Expand Down
Loading

0 comments on commit 3471db8

Please sign in to comment.