Skip to content

Commit 0f8f307

Browse files
committed
Adds advanced Flow examples page and examples from kube-logging/logging-operator#1234
Examples provided by genofire
1 parent 4e27ab6 commit 0f8f307

File tree

4 files changed

+147
-1
lines changed

4 files changed

+147
-1
lines changed

content/docs/examples/_index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ weight: 330
55

66
## Flow examples
77

8-
The following examples show some simple flows. For more examples that use filters, see {{% xref "/docs/examples/filters-in-flows.md" %}}.
8+
The following examples show some simple flows. For more advanced examples, see {{% xref "/docs/examples/filters-in-flows/_index.md" %}} and {{% xref "/docs/examples/flows/_index.md" %}}.
99

1010
### Flow with a single output
1111

content/docs/examples/flows/_index.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
title: Advanced Flow examples
3+
weight: 100
4+
---
5+
6+
## CoreDNS
7+
8+
This Flow:
9+
10+
- selects [CoreDNS](https://coredns.io/) messages (every message with the `k8s-app: coredns` label),
11+
- parses them, and
12+
- sets a number of related [Elastic Common Schema (ECS)](https://www.elastic.co/guide/en/ecs/current/ecs-getting-started.html) fields based on the content of the message using the {{% xref "/docs/configuration/plugins/filters/record_modifier.md" %}} plugin.
13+
14+
{{< include-code "logging_flow_coredns.yaml" "yaml" >}}
15+
16+
## NGINX Ingress Controller
17+
18+
This Flow:
19+
20+
- selects [NGINX Ingress Controller](https://docs.nginx.com/nginx-ingress-controller/) messages (every message with the `app-kubernetes-io/name: ingress-nginx` label),
21+
- parses them, and
22+
- sets a number of related [Elastic Common Schema (ECS)](https://www.elastic.co/guide/en/ecs/current/ecs-getting-started.html) fields based on the content of the message using the {{% xref "/docs/configuration/plugins/filters/record_modifier.md" %}} plugin.
23+
- It also adds GeoIP-related fields based on the source of the traffic using the [Fluentd GeoIP filter]({{< relref "/docs/configuration/plugins/filters/geoip.md" >}}).
24+
25+
{{< include-code "logging_flow_nginx_ingress.yaml" "yaml" >}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
apiVersion: logging.banzaicloud.io/v1beta1
2+
kind: Flow
3+
metadata:
4+
name: coredns
5+
namespace: kube-system
6+
spec:
7+
filters:
8+
- tag_normaliser: {}
9+
- parser:
10+
reserve_data: true
11+
remove_key_name_field: true
12+
parse:
13+
type: "regexp"
14+
expression: '^\[(?<log.level>.*)\] \[?(?<source.address>.*)\]?:(?<source.port>.*) - (?<dns.id>.*) "(?<dns.question.type>.*) (?<dns.question.class>.*) (?<dns.question.name>.*)\.? (?<network.transport>.*) (?<coredns.query.size>.*) (?<coredns.dnssec_ok>.*) (?<bufsize>.*)" (?<dns.response_code>.*) (?<dns.header_flags>.*) (?<coredns.response.size>.*) (?<coredns.duration>.*)s'
15+
types: "source.port:integer,dns.id:integer,coredns.query.size:integer,coredns.dnssec_ok:bool,bufsize:integer,dns.header_flags:array,coredns.response.size:integer,coredns.duration:float"
16+
- record_modifier:
17+
records:
18+
- source.ip: '${ record["source.address"] }'
19+
- dns.header_flags: '${ record["dns.header_flags"].map(&:upcase) }'
20+
- event.duration: '${ record["coredns.duration"] * 1000000000 }'
21+
- event.kind: "event"
22+
- event.category: "network"
23+
- event.type: "protocol"
24+
- event.outcome: '${ record["dns.response_code"] == "NOERROR" ? "success" : "failure" }'
25+
- event.protocol: "dns"
26+
- event.module: "coredns"
27+
- related.ip: '${ record["source.address"] }'
28+
# for dashboard
29+
- fileset.name: "kubernetes"
30+
# alias in elastic
31+
- coredns.query.name: '${ record["dns.question.name"] }'
32+
remove_keys: "coredns.duration,coredns.dnssec_ok"
33+
match:
34+
- select:
35+
labels:
36+
k8s-app: "coredns"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
apiVersion: logging.banzaicloud.io/v1beta1
2+
kind: Flow
3+
metadata:
4+
name: "ingress-nginx"
5+
spec:
6+
filters:
7+
- tag_normaliser: {}
8+
- parser:
9+
reserve_data: true
10+
remove_key_name_field: true
11+
inject_key_prefix: "nginx."
12+
parse:
13+
type: "regexp"
14+
# from https://raw.githubusercontent.com/fluent/fluentd/master/lib/fluent/plugin/parser_nginx.rb
15+
# enharance for ingress-controller by e.g.
16+
# https://github.com/elastic/beats/blob/v8.6.1/filebeat/module/nginx/ingress_controller/ingest/pipeline.yml
17+
expression: '^(?<remote>[^ ]*) -?(?<host>[^ ]*) -?(?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +(?<httpversion>HTTP\/[0-9\.]+)))" (?<code>[^ ]*) (?<size>[^ ]*)(?: "-?(?<referer>[^\"]*)" "(?<agent>[^\"]*)"\s+(?<reqlength>[0-9]+)\s(?<reqtime>[0-9\.]+)\s\[(?<upstream_name>[^ ]*)\]\s\[(?<alternative_name>[^\]]*)\] -?(?<upstream_address_list>[^ -]*) -?(?<reslength_list>[0-9\,]*) -?(?<restime_list>[0-9\.\,]*) -?(?<rescode_list>[0-9\,]*) (?<reqid>[^ ]+))?$'
18+
types: 'code:integer,size:integer,reqlength:integer,reqtime:float,upstream_address_list:array,reslenght_list:array,restime_list:array,rescode_list:array'
19+
time_key: "time"
20+
time_format: "%d/%b/%Y:%H:%M:%S %z"
21+
- record_modifier:
22+
records:
23+
- destination.domain: '${ !(record["nginx.referer"].nil?) ? URI(record["nginx.referer"]).host : record["nginx.host"] }'
24+
url.original: '${ record["nginx.referer"] }${ record["nginx.path"] }'
25+
url.domain: '${ !(record["nginx.referer"].nil?) ? URI(record["nginx.referer"]).host : record["nginx.host"] }'
26+
url.path: '${ record["nginx.path"] }'
27+
http.version: '${ record["nginx.httpversion"] }'
28+
nginx.access.remote_ip_list: '${ record["nginx.remote"] }'
29+
source.address: '${ record["nginx.remote"] }'
30+
source.ip: '${ record["nginx.remote"] }'
31+
related.ip: '${ record["nginx.remote"] }'
32+
http.request.method: '${ record["nginx.method"] }'
33+
http.request.referrer: '${ record["nginx.referer"] }'
34+
user.name: '${ record["nginx.user"] }'
35+
related.user: '${ record["nginx.user"] }'
36+
user_agent.original: '${ record["nginx.agent"] }'
37+
http.response.status_code: '${ record["nginx.code"] }'
38+
nginx.ingress_controller.http.request.length: '${ record["nginx.reqlength"] }'
39+
nginx.ingress_controller.http.request.time: '${ record["nginx.reqtime"] }'
40+
nginx.ingress_controller.upstream.name: '${ record["nginx.upstream_name"] }'
41+
nginx.ingress_controller.upstream.alternative_name: '${ record["nginx.alternative_name"] }'
42+
nginx.ingress_controller.upstream_address_list: '${ record["nginx.upstream_address_list"] }'
43+
# TODO split ip and port
44+
nginx.ingress_controller.upstream.address.merged: '${ [record["upstream_address_list"]].flatten&.last }'
45+
nginx.ingress_controller.upstream.response.length_list: '${ [record["nginx.reslength_list"]].flatten&.map(&:to_i) }'
46+
nginx.ingress_controller.upstream.response.length: '${ [record["nginx.reslength_list"]].flatten&.last&.to_i }'
47+
nginx.ingress_controller.upstream.response.time_list: '${ [record["nginx.restime_list"]].flatten&.map(&:to_f) }'
48+
nginx.ingress_controller.upstream.response.time: '${ [record["nginx.restime_list"]].flatten&.last&.to_f }'
49+
nginx.ingress_controller.upstream.response.status_code_list: '${ [record["nginx.rescode_list"]].flatten&.map(&:to_i) }'
50+
nginx.ingress_controller.upstream.response.status_code: '${ [record["nginx.rescode_list"]].flatten&.last&.to_i }'
51+
nginx.ingress_controller.http.request.id: '${ record["nginx.reqid"] }'
52+
http.request.id: '${ record["nginx.reqid"] }'
53+
http.response.body.bytes: '${ record["nginx.size"] }'
54+
event.created: '${ time * 1000 }'
55+
event.kind: "event"
56+
event.category: "web"
57+
event.type: "access"
58+
event.module: "nginx"
59+
event.outcome: '${ record["nginx.code"].to_i < 400 ? "success" : "failure" }'
60+
# for dashboard
61+
fileset.name: '${[ "ingress_controller", "access" ]}'
62+
remove_keys: "nginx.remote,nginx.host,nginx.user,nginx.method,nginx.path,nginx.httpversion,nginx.code,nginx.size,nginx.referer,nginx.agent,nginx.reqlength,nginx.reqtime,nginx.upstream_name,nginx.alternative_name,nginx.upstream_address_list,nginx.reslength_list,nginx.restime_list,nginx.rescode_list,nginx.reqid"
63+
- geoip:
64+
geoip_lookup_keys: "source.ip"
65+
backend_library: geoip2_c
66+
skip_adding_null_record: false
67+
records:
68+
- source.geo.country_name: '${country.names.en["source.ip"]}'
69+
source.geo.country_iso_code: '${country.iso_code["source.ip"]}'
70+
source.geo.city_name: '${city.names.en["source.ip"]}'
71+
source.geo.region_iso_code: '${subdivisions.0.iso_code["source.ip"]}'
72+
source.geo.region_name: '${subdivisions.0.names.en["source.ip"]}'
73+
source.geo.location: '''{ "lat": ${location.latitude["source.ip"]}, "lon": ${location.longitude["source.ip"]} }'''
74+
# - geoip:
75+
# geoip_lookup_keys: "source.ip"
76+
# backend_library: geoip
77+
# skip_adding_null_record: false
78+
# records:
79+
# - source.geo.continent_name: '${continent.names.en["source.ip"]}'
80+
# # source.as.number: '${asn["source.ip"]}'
81+
# # source.as.organization.name: '${organization["source.ip"]}'
82+
match:
83+
- select:
84+
labels:
85+
app-kubernetes-io/name: "ingress-nginx"

0 commit comments

Comments
 (0)