Add OpenTelemetry Collector configuration for log ingestion

- Introduced a new OpenTelemetryCollector resource in the Helm chart.
- Configured filelog receiver to ingest logs based on specified patterns.
- Added processors for Kubernetes attributes and resource metadata.
- Set up Loki exporter for log forwarding with appropriate labels.
- Configured logging verbosity and defined log processing pipelines.

Signed-off-by: zhenyus <zhenyus@mathmast.com>
This commit is contained in:
zhenyus 2025-04-16 05:45:40 +08:00
parent 842f811767
commit a0d88d9507
8 changed files with 17202 additions and 40244 deletions

View File

@ -1,111 +0,0 @@
---
apiVersion: fluentd.fluent.io/v1alpha1
kind: ClusterOutput
metadata:
name: freeleaps-logging-system-loki
labels:
fluentd-default-output: "true"
spec:
outputs:
- loki:
url: http://loki-gateway.freeleaps-logging-system
lineFormat: json
insecure: true
extractKubernetesLabels: true
---
apiVersion: fluentd.fluent.io/v1alpha1
kind: Fluentd
metadata:
name: fluentd
namespace: freeleaps-logging-system
spec:
globalInputs:
- forward:
bind: "0.0.0.0"
port: 24224
fluentdCfgSelector:
matchLabels:
fluentd-default-config: "true"
replicas: 2
workers: 1
image: kubesphere/fluentd:v1.17
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- fluentd
topologyKey: "kubernetes.io/hostname"
envVars:
# Node information
- name: K8S_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: K8S_NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
# Pod information
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
buffer:
disableBufferVolume: true
---
apiVersion: fluentd.fluent.io/v1alpha1
kind: ClusterFilter
metadata:
name: fluentd-metadata-appender
labels:
fluentd-default-filter: "true"
spec:
filters:
- recordTransformer:
enableRuby: true
records:
- key: fluentd_pod_name
value: ${ENV["POD_NAME"] || "unknown"}
- key: fluentd_pod_ip
value: ${ENV["POD_IP"] || "unknown"}
- key: fluentd_pod_namespace
value: ${ENV["POD_NAMESPACE"] || "unknown"}
- key: fluentd_node_name
value: ${ENV["K8S_NODE_NAME"] || "unknown"}
- key: fluentd_node_ip
value: ${ENV["K8S_NODE_IP"] || "unknown"}
---
apiVersion: fluentd.fluent.io/v1alpha1
kind: FluentdConfig
metadata:
name: freeleaps-logging-fluentd-pipeline
namespace: freeleaps-logging-system
labels:
fluentd-default-config: "true"
spec:
clusterFilterSelector:
matchLabels:
fluentd-default-filter: "true"
clusterOutputSelector:
matchLabels:
fluentd-default-output: "true"
---

View File

@ -25,6 +25,9 @@ spec:
app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/instance: {{ .Release.Name }}
annotations: annotations:
app.kubernetes.io/config-checksum: {{ include (print $.Template.BasePath "/authentication/authentication-config.yaml") . | sha256sum }} app.kubernetes.io/config-checksum: {{ include (print $.Template.BasePath "/authentication/authentication-config.yaml") . | sha256sum }}
{{- if .Values.logIngest.enabled }}
sidecar.opentelemetry.io/inject: "true"
{{- end }}
spec: spec:
containers: containers:
- name: "authentication" - name: "authentication"

View File

@ -1,39 +0,0 @@
{{- if .Values.fluentbit.enabled }}
apiVersion: fluentbit.fluent.io/v1alpha2
kind: Parser
metadata:
name: {{ .Release.Name }}-log-parser
namespace: {{ .Release.Namespace | quote }}
labels:
app.kubernetes.io/name: {{ .Release.Name }}-log-parser
spec:
json:
timeKey: {{ .Values.fluentbit.timeKey | quote }}
timeFormat: {{ .Values.fluentbit.timeFormat | quote }}
---
apiVersion: fluentbit.fluent.io/v1alpha2
kind: Output
metadata:
name: {{ .Release.Name }}-log-output
namespace: {{ .Release.Namespace | quote }}
labels:
app.kubernetes.io/name: {{ .Release.Name }}-log-output
spec:
match: "*"
forward:
host: fluentd.freeleaps-logging-system
port: 24224
---
apiVersion: fluentbit.fluent.io/v1alpha2
kind: FluentBitConfig
metadata:
name: {{ .Release.Name }}-log-collector-config
namespace: {{ .Release.Namespace | quote }}
spec:
outputSelector:
matchLabels:
app.kubernetes.io/name: {{ .Release.Name }}-log-output
parserSelector:
matchLabels:
app.kubernetes.io/name: {{ .Release.Name }}-log-parser
{{- end }}

View File

@ -0,0 +1,87 @@
{{- if .Values.logIngest.enabled }}
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: {{ .Release.Name }}-opentelemetry-collector
namespace: {{ .Release.Namespace }}
spec:
mode: sidecar
image: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:latest
config: |
receivers:
filelog:
include:
- {{ .Values.logIngest.logPathPattern }}
start_at: beginning
include_file_path: true
include_file_name: true
operators:
- type: json_parser
timestamp:
parse_from: record.time.timestamp
layout: unix_float
- type: move
from record.level.name
to: severity
- type: move
from: record.message
to: message
processors:
k8sattributes:
auth_type: "serviceAccount"
passthrough: false
extract:
- k8s.pod.name
- k8s.pod.ip
- k8s.pod.uid
- k8s.deployment.name
- k8s.deployment.uid
- k8s.namespace.name
- k8s.node.name
pod_association:
- sources:
- from: resource_attribute
name: k8s.pod.ip
- sources:
- from: resource_attribute
name: k8s.pod.uid
resource:
attributes:
- key: service.name
value: "{{ .Release.Name }}"
action: upsert
- key: service.namespace
value: "{{ .Release.Namespace }}"
action: upsert
batch:
send_batch_size: 1000
timeout: 10s
exporters:
loki:
endpoint: {{ .Values.logIngest.lokiEndpoint }}
labels:
resource:
service.name: "service.name"
service.namespace: "service.namespace"
k8s.pod.name: "k8s.pod.name"
k8s.namespace.name: "k8s.namespace.name"
k8s.node.name: "k8s.node.name"
k8s.deployment.name: "k8s.deployment.name"
record:
severity: "severity"
logging:
verbosity: detailed
service:
telemetry:
logs:
level: "info"
pipelines:
logs:
receivers: [filelog]
processors: [k8sattributes, resource, batch]
exporters: [loki, logging]
{{- end }}

View File

@ -4,20 +4,10 @@ global:
nodeSelector: {} nodeSelector: {}
dashboard: dashboard:
enabled: false enabled: false
fluentbit: logIngest:
enabled: true enabled: true
resources: lokiEndpoint: http://loki-gateway.freeleaps-logging-system/loki/api/v1/push
requests: logPathPattern: /app/log/authentication/*.log
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 512Mi
image: kubesphere/fluent-bit:v4.0-debug
imagePullPolicy: IfNotPresent
timeKey: record.repr
timeFormat: "%Y-%m-%dT%H:%M:%S.%LZ"
logPath: /app/log/authentication/*.log
authentication: authentication:
replicas: 1 replicas: 1
image: image:

View File

@ -7,6 +7,10 @@ dashboard:
name: freeleaps-prod-authentication-dashboard name: freeleaps-prod-authentication-dashboard
title: Authentication Service Dashboard title: Authentication Service Dashboard
metricsPrefix: freeleaps_authentication metricsPrefix: freeleaps_authentication
logIngest:
enabled: false
lokiEndpoint: http://loki-gateway.freeleaps-logging-system/loki/api/v1/push
logPathPattern: /app/log/authentication/*.log
fluentbit: fluentbit:
enabled: false enabled: false
resources: resources: