apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: podlogs.monitoring.grafana.com spec: group: monitoring.grafana.com names: categories: - grafana-alloy - alloy kind: PodLogs listKind: PodLogsList plural: podlogs singular: podlogs scope: Namespaced versions: - name: v1alpha2 schema: openAPIV3Schema: description: PodLogs defines how to collect logs for a Pod. properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object spec: description: PodLogsSpec defines how to collect logs for a Pod. properties: namespaceSelector: description: Selector to select which namespaces the Pod objects are discovered from. properties: matchExpressions: description: matchExpressions is a list of label selector requirements. The requirements are ANDed. items: description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. properties: key: description: key is the label key that the selector applies to. type: string operator: description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string values: description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. items: type: string type: array required: - key - operator type: object type: array matchLabels: additionalProperties: type: string description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. type: object type: object x-kubernetes-map-type: atomic relabelings: description: RelabelConfigs to apply to logs before delivering. items: description: 'RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion. It defines ``-section of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' properties: action: default: replace description: Action to perform based on regex matching. Default is 'replace'. uppercase and lowercase actions require Prometheus >= 2.36. enum: - replace - Replace - keep - Keep - drop - Drop - hashmod - HashMod - labelmap - LabelMap - labeldrop - LabelDrop - labelkeep - LabelKeep - lowercase - Lowercase - uppercase - Uppercase type: string modulus: description: Modulus to take of the hash of the source label values. format: int64 type: integer regex: description: Regular expression against which the extracted value is matched. Default is '(.*)' type: string replacement: description: Replacement value against which a regex replace is performed if the regular expression matches. Regex capture groups are available. Default is '$1' type: string separator: description: Separator placed between concatenated source label values. default is ';'. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured separator and matched against the configured regular expression for the replace, keep, and drop actions. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as well as underscores. pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ type: string type: array targetLabel: description: Label to which the resulting value is written in a replace action. It is mandatory for replace actions. Regex capture groups are available. type: string type: object type: array selector: description: Selector to select Pod objects. Required. properties: matchExpressions: description: matchExpressions is a list of label selector requirements. The requirements are ANDed. items: description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. properties: key: description: key is the label key that the selector applies to. type: string operator: description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. type: string values: description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. items: type: string type: array required: - key - operator type: object type: array matchLabels: additionalProperties: type: string description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. type: object type: object x-kubernetes-map-type: atomic required: - selector type: object type: object served: true storage: true --- apiVersion: v1 automountServiceAccountToken: true kind: ServiceAccount metadata: labels: app.kubernetes.io/component: rbac app.kubernetes.io/instance: alloy app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alloy app.kubernetes.io/part-of: alloy app.kubernetes.io/version: v1.11.3 helm.sh/chart: alloy-1.4.0 name: alloy namespace: grafana-alloy --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/component: rbac app.kubernetes.io/instance: alloy app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alloy app.kubernetes.io/part-of: alloy app.kubernetes.io/version: v1.11.3 helm.sh/chart: alloy-1.4.0 name: alloy rules: - apiGroups: - "" - discovery.k8s.io - networking.k8s.io resources: - endpoints - endpointslices - ingresses - pods - services verbs: - get - list - watch - apiGroups: - "" resources: - pods - pods/log - namespaces verbs: - get - list - watch - apiGroups: - monitoring.grafana.com resources: - podlogs verbs: - get - list - watch - apiGroups: - monitoring.coreos.com resources: - prometheusrules verbs: - get - list - watch - apiGroups: - monitoring.coreos.com resources: - podmonitors - servicemonitors - probes - scrapeconfigs verbs: - get - list - watch - apiGroups: - "" resources: - events verbs: - get - list - watch - apiGroups: - "" resources: - configmaps - secrets verbs: - get - list - watch - apiGroups: - apps - extensions resources: - replicasets verbs: - get - list - watch - apiGroups: - "" resources: - nodes - nodes/proxy - nodes/metrics verbs: - get - list - watch - nonResourceURLs: - /metrics verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/component: rbac app.kubernetes.io/instance: alloy app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alloy app.kubernetes.io/part-of: alloy app.kubernetes.io/version: v1.11.3 helm.sh/chart: alloy-1.4.0 name: alloy roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: alloy subjects: - kind: ServiceAccount name: alloy namespace: grafana-alloy --- apiVersion: v1 data: config.alloy: |- loki.write "default" { endpoint { url = "http://loki-gateway.grafana-loki.svc.cluster.local/loki/api/v1/push" tenant_id = "prod" } } discovery.kubernetes "pod" { role = "pod" } loki.source.kubernetes "pod_logs" { targets = discovery.kubernetes.pod.targets forward_to = [loki.write.default.receiver] } kind: ConfigMap metadata: labels: app.kubernetes.io/component: config app.kubernetes.io/instance: alloy app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alloy app.kubernetes.io/part-of: alloy app.kubernetes.io/version: v1.11.3 helm.sh/chart: alloy-1.4.0 name: alloy namespace: grafana-alloy --- apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: networking app.kubernetes.io/instance: alloy app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alloy app.kubernetes.io/part-of: alloy app.kubernetes.io/version: v1.11.3 helm.sh/chart: alloy-1.4.0 name: alloy namespace: grafana-alloy spec: internalTrafficPolicy: Cluster ports: - name: http-metrics port: 12345 protocol: TCP targetPort: 12345 selector: app.kubernetes.io/instance: alloy app.kubernetes.io/name: alloy type: ClusterIP --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app.kubernetes.io/instance: alloy app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alloy app.kubernetes.io/part-of: alloy app.kubernetes.io/version: v1.11.3 helm.sh/chart: alloy-1.4.0 name: alloy namespace: grafana-alloy spec: minReadySeconds: 10 selector: matchLabels: app.kubernetes.io/instance: alloy app.kubernetes.io/name: alloy template: metadata: annotations: kubectl.kubernetes.io/default-container: alloy labels: app.kubernetes.io/instance: alloy app.kubernetes.io/name: alloy spec: containers: - args: - run - /etc/alloy/config.alloy - --storage.path=/tmp/alloy - --server.http.listen-addr=0.0.0.0:12345 - --server.http.ui-path-prefix=/ - --stability.level=generally-available env: - name: ALLOY_DEPLOY_MODE value: helm - name: HOSTNAME valueFrom: fieldRef: fieldPath: spec.nodeName image: docker.io/grafana/alloy:v1.11.3 imagePullPolicy: IfNotPresent name: alloy ports: - containerPort: 12345 name: http-metrics readinessProbe: httpGet: path: /-/ready port: 12345 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1 volumeMounts: - mountPath: /etc/alloy name: config - args: - --watched-dir=/etc/alloy - --reload-url=http://localhost:12345/-/reload image: quay.io/prometheus-operator/prometheus-config-reloader:v0.81.0 name: config-reloader resources: requests: cpu: 10m memory: 50Mi volumeMounts: - mountPath: /etc/alloy name: config dnsPolicy: ClusterFirst serviceAccountName: alloy volumes: - configMap: name: alloy name: config