# Traffic Log

With TrafficLog policy you can easily set up access logs on every data-plane in a Mesh.

The logs can be then forwarded to a collector that can further transmit them into systems like Splunk, ELK and Datadog.

Configuring access logs in Kuma is a 2-step process:

  1. First, you need to configure logging backends that will be available for use in a given Mesh.

    A logging backend is essentially a sink for access logs.

    In the current release of Kuma, a logging backend can be either a file or a TCP log collector, such as Logstash.

  2. Second, you need to create a TrafficLog policy to select a subset of traffic and forward its access logs into one of the logging backends configured for that Mesh.

# On Universal

type: Mesh
name: default
logging:
  # TrafficLog policies may leave the `backend` field undefined.
  # In that case the logs will be forwarded into the `defaultBackend` of that Mesh.
  defaultBackend: file
  # List of logging backends that can be referred to by name
  # from TrafficLog policies of that Mesh.
  backends:
    - name: logstash
      # Use `format` field to adjust the access log format to your use case.
      format: '{"start_time": "%START_TIME%", "source": "%KUMA_SOURCE_SERVICE%", "destination": "%KUMA_DESTINATION_SERVICE%", "source_address": "%KUMA_SOURCE_ADDRESS_WITHOUT_PORT%", "destination_address": "%UPSTREAM_HOST%", "duration_millis": %DURATION%, "bytes_received": %BYTES_RECEIVED%, "bytes_sent": %BYTES_SENT%}'
      # Use `tcp` field to co configure a TCP logging backend.
      tcp:
        # Address of a log collector.
        address: 127.0.0.1:5000
    - name: file
      # Use `file` field to configure a file-based logging backend.
      file:
        path: /tmp/access.log
      # When `format` field is omitted, the default access log format will be used.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type: TrafficLog
name: all-traffic
mesh: default
# This TrafficLog policy applies to all traffic in the Mesh.
sources:
  - match:
      service: '*'
destinations:
  - match:
      service: '*'
# When `backend ` field is omitted, the logs will be forwarded into the `defaultBackend` of that Mesh.
1
2
3
4
5
6
7
8
9
10
11
type: TrafficLog
name: backend-to-database-traffic
mesh: default
# this TrafficLog policy applies only to traffic from service `backend` to service `database`.
sources:
  - match:
      service: backend
destinations:
  - match:
      service: database
conf:
  # Forward the logs into the logging backend named `logstash`.
  backend: logstash
1
2
3
4
5
6
7
8
9
10
11
12
13

# On Kubernetes

apiVersion: kuma.io/v1alpha1
kind: Mesh
metadata:
  name: default
spec:
  logging:
    # TrafficLog policies may leave the `backend` field undefined.
    # In that case the logs will be forwarded into the `defaultBackend` of that Mesh.
    defaultBackend: file
    # List of logging backends that can be referred to by name
    # from TrafficLog policies of that Mesh.
    backends:
      - name: logstash
        # Use `format` field to adjust the access log format to your use case.
        format: '{"start_time": "%START_TIME%", "source": "%KUMA_SOURCE_SERVICE%", "destination": "%KUMA_DESTINATION_SERVICE%", "source_address": "%KUMA_SOURCE_ADDRESS_WITHOUT_PORT%", "destination_address": "%UPSTREAM_HOST%", "duration_millis": %DURATION%, "bytes_received": %BYTES_RECEIVED%, "bytes_sent": %BYTES_SENT%}'
        # Use `tcp` field to co configure a TCP logging backend.
        tcp:
          # Address of a log collector.
          address: 127.0.0.1:5000
      - name: file
        # Use `file` field to configure a file-based logging backend.
        file:
          path: /tmp/access.log
        # When `format` field is omitted, the default access log format will be used.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: kuma.io/v1alpha1
kind: TrafficLog
metadata:
  namespace: kuma-example
  name: all-traffic
mesh: default
spec:
  # This TrafficLog policy applies all traffic in that Mesh.
  sources:
    - match:
        service: '*'
  destinations:
    - match:
        service: '*'
  # When `backend ` field is omitted, the logs will be forwarded into the `defaultBackend` of that Mesh.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: kuma.io/v1alpha1
kind: TrafficLog
metadata:
  namespace: kuma-example
  name: backend-to-database-traffic
spec:
  # This TrafficLog policy applies only to traffic from service `backend` to service `database`.
  sources:
    - match:
        service: backend.kuma-example.svc:8080
  destinations:
    - match:
        service: database.kuma-example.svc:5432
  conf:
    # Forward the logs into the logging backend named `logstash`.
    backend: logstash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

When backend field of a TrafficLog policy is omitted, the logs will be forwarded into the defaultBackend of that Mesh.

# Access Log Format

Kuma gives you full control over the format of access logs.

The shape of a single log record is defined by a template string that uses command operators to extract and format data about a TCP connection or an HTTP request.

E.g.,

%START_TIME% %KUMA_SOURCE_SERVICE% => %KUMA_DESTINATION_SERVICE% %DURATION%
1

where %START_TIME% and %KUMA_SOURCE_SERVICE% are examples of available command operators.

A complete set of supported command operators consists of:

  1. All command operators supported by Envoy
  2. Command operators unique to Kuma

The latter include:

Command Operator Description
%KUMA_MESH% name of the mesh in which traffic is flowing
%KUMA_SOURCE_SERVICE% name of a service that is the source of traffic
%KUMA_DESTINATION_SERVICE% name of a service that is the destination of traffic
%KUMA_SOURCE_ADDRESS_WITHOUT_PORT% address of a Dataplane that is the source of traffic

# Access Logs for TCP and HTTP traffic

All access log command operators are valid to use with both TCP and HTTP traffic.

If a command operator is specific to HTTP traffic, such as %REQ(X?Y):Z% or %RESP(X?Y):Z%, it will be replaced by a symbol "-" in case of TCP traffic.

Internally, Kuma determines traffic protocol based on the value of protocol tag on the inbound interface of a destination Dataplane.

The default format string for TCP traffic is:

[%START_TIME%] %RESPONSE_FLAGS% %KUMA_MESH% %KUMA_SOURCE_ADDRESS_WITHOUT_PORT%(%KUMA_SOURCE_SERVICE%)->%UPSTREAM_HOST%(%KUMA_DESTINATION_SERVICE%) took %DURATION%ms, sent %BYTES_SENT% bytes, received: %BYTES_RECEIVED% bytes
1

The default format string for HTTP traffic is:

[%START_TIME%] %KUMA_MESH% "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%KUMA_SOURCE_SERVICE%" "%KUMA_DESTINATION_SERVICE%" "%KUMA_SOURCE_ADDRESS_WITHOUT_PORT%" "%UPSTREAM_HOST%"
1

To provide different format for TCP and HTTP logging you can define two separate logging backends with the same address and different format. Then define two TrafficLog entity, one for TCP and one for HTTP with protocol: http selector.

# Access Logs in JSON format

If you need an access log with entries in JSON format, you have to provide a template string that is a valid JSON object, e.g.

{
  "start_time":          "%START_TIME%",
  "source":              "%KUMA_SOURCE_SERVICE%",
  "destination":         "%KUMA_DESTINATION_SERVICE%",
  "source_address":      "%KUMA_SOURCE_ADDRESS_WITHOUT_PORT%",
  "destination_address": "%UPSTREAM_HOST%",
  "duration_millis":     %DURATION%,
  "bytes_received":      %BYTES_RECEIVED%,
  "bytes_sent":          %BYTES_SENT%
}
1
2
3
4
5
6
7
8
9
10

To use it with Logstash, use json_lines codec and make sure your JSON is formatted into one line.

Last Updated: 7/29/2020, 12:05:20 PM