Skip to content

Commit

Permalink
Merge pull request #141 from arunvthangaraj/main
Browse files Browse the repository at this point in the history
feat: ADOT Container logs collection
  • Loading branch information
elamaran11 committed Feb 6, 2024
2 parents 32fdf78 + 6f9a744 commit bf4b538
Show file tree
Hide file tree
Showing 9 changed files with 242 additions and 9 deletions.
Binary file added docs/patterns/images/ADOT_container_logs.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Single Cluster Open Source Observability - Container Logs Collection

## Objective

Following the [announcement](https://aws.amazon.com/about-aws/whats-new/2023/11/logs-support-aws-distro-opentelemetry/) of logs support in AWS Distro for OpenTelemetry, this pattern demonstrates how to use the _New EKS Cluster Open Source Observability Accelerator_ to forward container logs to cloud watch using ADOT containers log collector.

## Prerequisites

Ensure that you have installed the following tools on your machine.

1. [aws cli](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
2. [kubectl](https://Kubernetes.io/docs/tasks/tools/)
3. [cdk](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install)
4. [npm](https://docs.npmjs.com/cli/v8/commands/npm-install)

## Deploying

Please follow the _Deploying_ instructions of the [New EKS Cluster Open Source Observability Accelerator](./single-new-eks-opensource-observability.md) pattern, except for step 7, where you need to replace "context" in `~/.cdk.json` with the following:

```typescript
"context": {
"fluxRepository": {
"name": "grafana-dashboards",
"namespace": "grafana-operator",
"repository": {
"repoUrl": "https://github.com/aws-observability/aws-observability-accelerator",
"name": "grafana-dashboards",
"targetRevision": "main",
"path": "./artifacts/grafana-operator-manifests/eks/infrastructure"
},
"values": {
"GRAFANA_CLUSTER_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/cluster.json",
"GRAFANA_KUBELET_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/kubelet.json",
"GRAFANA_NSWRKLDS_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/namespace-workloads.json",
"GRAFANA_NODEEXP_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/nodeexporter-nodes.json",
"GRAFANA_NODES_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/nodes.json",
"GRAFANA_WORKLOADS_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/workloads.json"
},
"kustomizations": [
{
"kustomizationPath": "./artifacts/grafana-operator-manifests/eks/infrastructure"
}
]
},
"adotcontainerlogs.pattern.enabled": true
}
```

!! warning This scenario might need larger worker node for the pod.


Once completed the rest of the _Deploying_ steps, you can move on with the deployment of the Nginx workload.

## Viewing Logs in CloudWatch Log Groups and Logs Insights

Navigate to CloudWatch, then go to "Log groups"

Search for log group with the name "/aws/eks/single-new-eks-mixed-observability-accelerator" and open it

You will see log streams created using the node name

![ADOT_container_logs_group](../images/ADOT_container_logs_group.png)

Open the log stream and you view the logs forwarded by the container logs collector to CloudWatch

![ADOT_container_logs](../images/ADOT_container_logs.png)

Navigate to CloudWatch, then go to "Logs Insights"

In the dropdown, select log group with name "/aws/eks/single-new-eks-mixed-observability-accelerator" and run a query.

![ADOT_container_logs_insights](../images/ADOT_container_logs_insights.png)

Then you can view the results of your query:

![ADOT_container_logs_insights](../images/ADOT_container_logs_insights_results.png)

## Teardown

You can teardown the whole CDK stack with the following command:

```bash
make pattern single-new-eks-opensource-observability destroy
```
110 changes: 109 additions & 1 deletion lib/common/resources/otel-collector-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ metadata:
namespace: "{{namespace}}"
spec:
mode: "{{deploymentMode}}"
image: public.ecr.aws/aws-observability/aws-otel-collector:v0.33.1
image: public.ecr.aws/aws-observability/aws-otel-collector:v0.37.0
resources:
limits:
cpu: "1"
Expand All @@ -18,6 +18,22 @@ spec:
cpu: "1"
memory: "2Gi"
serviceAccount: adot-collector
podSecurityContext:
runAsGroup: 0
runAsUser: 0
volumeMounts:
- name: varlogpods
mountPath: /var/log/pods
readOnly: true
volumes:
- name: varlogpods
hostPath:
path: /var/log/pods
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
config: |
receivers:
prometheus:
Expand Down Expand Up @@ -1740,13 +1756,101 @@ spec:
source_labels:
- __meta_kubernetes_pod_phase
{{ stop enableIstioMonJob }}
{{ start enableAdotContainerLogsReceiver }}
filelog:
include: [ /var/log/pods/*/*/*.log ]
include_file_name: false
include_file_path: true
start_at: end
operators:
# Find out which format is used by kubernetes
- type: router
id: get-format
routes:
- output: parser-docker
expr: 'body matches "^\\{"'
- output: parser-crio
expr: 'body matches "^[^ Z]+ "'
- output: parser-containerd
expr: 'body matches "^[^ Z]+Z"'
# Parse CRI-O format
- type: regex_parser
id: parser-crio
regex:
'^(?P<time>[^ Z]+) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*)
?(?P<log>.*)$'
output: extract_metadata_from_filepath
timestamp:
parse_from: attributes.time
layout_type: gotime
layout: '2006-01-02T15:04:05.999999999Z07:00'
# Parse CRI-Containerd format
- type: regex_parser
id: parser-containerd
regex:
'^(?P<time>[^ ^Z]+Z) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*)
?(?P<log>.*)$'
output: extract_metadata_from_filepath
timestamp:
parse_from: attributes.time
layout: '%Y-%m-%dT%H:%M:%S.%LZ'
# Parse Docker format
- type: json_parser
id: parser-docker
output: extract_metadata_from_filepath
timestamp:
parse_from: attributes.time
layout: '%Y-%m-%dT%H:%M:%S.%LZ'
- type: move
from: attributes.log
to: body
# Extract metadata from file path
- type: regex_parser
id: extract_metadata_from_filepath
regex: '^.*\/(?P<namespace>[^_]+)_(?P<pod_name>[^_]+)_(?P<uid>[a-f0-9\-]{36})\/(?P<container_name>[^\._]+)\/(?P<restart_count>\d+)\.log$'
parse_from: attributes["log.file.path"]
cache:
size: 128 # default maximum amount of Pods per Node is 110
# Rename attributes
- type: move
from: attributes.stream
to: attributes["log.iostream"]
- type: move
from: attributes.container_name
to: resource["k8s.container.name"]
- type: move
from: attributes.namespace
to: resource["k8s.namespace.name"]
- type: move
from: attributes.pod_name
to: resource["k8s.pod.name"]
- type: move
from: attributes.restart_count
to: resource["k8s.container.restart_count"]
- type: move
from: attributes.uid
to: resource["k8s.pod.uid"]
{{ stop enableAdotContainerLogsReceiver }}
processors:
k8sattributes:
batch:
exporters:
prometheusremotewrite:
endpoint: "{{remoteWriteEndpoint}}"
auth:
authenticator: sigv4auth
logging:
loglevel: info
{{ start enableAdotContainerLogsExporter }}
awscloudwatchlogs:
log_group_name: "{{logGroupName}}"
log_stream_name: "{{logStreamName}}"
region: "{{awsRegion}}"
log_retention: {{logRetentionDays}}
raw_log: false
{{ stop enableAdotContainerLogsExporter }}
extensions:
sigv4auth:
region: "{{awsRegion}}"
Expand All @@ -1762,6 +1866,10 @@ spec:
metrics:
receivers: [prometheus]
exporters: [logging, prometheusremotewrite]
logs:
receivers: [filelog]
processors: [batch,k8sattributes]
exporters: [awscloudwatchlogs]
{{ start enableAdotMetricsCollectionTelemetry }}
telemetry:
metrics:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,18 @@ export default class SingleNewEksGravitonOpenSourceObservabilityPattern {
"{{ stop enableAdotMetricsCollectionTelemetry }}",
jsonStringnew.context["adotcollectormetrics.pattern.enabled"]
);
doc = utils.changeTextBetweenTokens(
doc,
"{{ start enableAdotContainerLogsReceiver }}",
"{{ stop enableAdotContainerLogsReceiver }}",
jsonStringnew.context["adotcontainerlogs.pattern.enabled"]
);
doc = utils.changeTextBetweenTokens(
doc,
"{{ start enableAdotContainerLogsExporter }}",
"{{ stop enableAdotContainerLogsExporter }}",
jsonStringnew.context["adotcontainerlogs.pattern.enabled"]
);
console.log(doc);
fs.writeFileSync(__dirname + '/../common/resources/otel-collector-config-new.yml', doc);

Expand All @@ -102,6 +114,18 @@ export default class SingleNewEksGravitonOpenSourceObservabilityPattern {
);
}

if (utils.valueFromContext(scope, "adotcontainerlogs.pattern.enabled", false)) {
ampAddOnProps.openTelemetryCollector = {
manifestPath: __dirname + '/../common/resources/otel-collector-config-new.yml',
manifestParameterMap: {
logGroupName: `/aws/eks/${stackId}`,
logStreamName: `/aws/eks/${stackId}`,
logRetentionDays: 30,
awsRegion: region
}
};
}

if (utils.valueFromContext(scope, "apiserver.pattern.enabled", false)) {
ampAddOnProps.enableAPIServerJob = true,
ampAddOnProps.ampRules?.ruleFilePaths.push(
Expand Down Expand Up @@ -134,10 +158,6 @@ export default class SingleNewEksGravitonOpenSourceObservabilityPattern {

Reflect.defineMetadata("ordered", true, blueprints.addons.GrafanaOperatorAddon);
const addOns: Array<blueprints.ClusterAddOn> = [
new blueprints.addons.CloudWatchLogsAddon({
logGroupPrefix: `/aws/eks/${stackId}`,
logRetentionDays: 30
}),
new blueprints.addons.XrayAdotAddOn(),
new blueprints.addons.FluxCDAddOn({"repositories": [fluxRepository]}),
new GrafanaOperatorSecretAddon(),
Expand Down
28 changes: 24 additions & 4 deletions lib/single-new-eks-opensource-observability-pattern/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,18 @@ export default class SingleNewEksOpenSourceobservabilityPattern {
"{{ stop enableAdotMetricsCollectionTelemetry }}",
jsonStringnew.context["adotcollectormetrics.pattern.enabled"]
);
doc = utils.changeTextBetweenTokens(
doc,
"{{ start enableAdotContainerLogsReceiver }}",
"{{ stop enableAdotContainerLogsReceiver }}",
jsonStringnew.context["adotcontainerlogs.pattern.enabled"]
);
doc = utils.changeTextBetweenTokens(
doc,
"{{ start enableAdotContainerLogsExporter }}",
"{{ stop enableAdotContainerLogsExporter }}",
jsonStringnew.context["adotcontainerlogs.pattern.enabled"]
);
console.log(doc);
fs.writeFileSync(__dirname + '/../common/resources/otel-collector-config-new.yml', doc);

Expand Down Expand Up @@ -135,12 +147,20 @@ export default class SingleNewEksOpenSourceobservabilityPattern {
);
}

if (utils.valueFromContext(scope, "adotcontainerlogs.pattern.enabled", false)) {
ampAddOnProps.openTelemetryCollector = {
manifestPath: __dirname + '/../common/resources/otel-collector-config-new.yml',
manifestParameterMap: {
logGroupName: `/aws/eks/${stackId}`,
logStreamName: `$NODE_NAME`,
logRetentionDays: 30,
awsRegion: region
}
};
}

Reflect.defineMetadata("ordered", true, blueprints.addons.GrafanaOperatorAddon);
const addOns: Array<blueprints.ClusterAddOn> = [
new blueprints.addons.CloudWatchLogsAddon({
logGroupPrefix: `/aws/eks/${stackId}`,
logRetentionDays: 30
}),
new blueprints.addons.XrayAdotAddOn(),
new blueprints.addons.FluxCDAddOn({"repositories": [fluxRepository]}),
new GrafanaOperatorSecretAddon()
Expand Down
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ nav:
- OSS Java Mon : patterns/single-new-eks-observability-accelerators/single-new-eks-java-opensource-observability.md
- OSS Nginx Mon : patterns/single-new-eks-observability-accelerators/single-new-eks-nginx-opensource-observability.md
- OSS ADOT Collector Mon: patterns/single-new-eks-observability-accelerators/single-new-eks-adotmetrics-collection-opensource-observability.md
- OSS ADOT Container Logs: patterns/single-new-eks-observability-accelerators/single-new-eks-container-logs-opensource-observability.md
- Logs: logs.md
- Tracing: tracing.md
- Supporting Examples:
Expand Down

0 comments on commit bf4b538

Please sign in to comment.