Splunk/Observability

Custom otel collector configuration in AWS ECS EC2

야솔아빠 2024. 3. 23. 22:13
반응형

splunk otel collector는 ECS 환경에서 커스터마이징 하는 방법입니다.

workaround 방법이지만 쉽게 응용할 수 있습니다.

splunk-otel-collector container definition에 아래 처럼 정의합니다.

"entryPoint": [
    "sh",
    "-c"
],
"command": [
   "curl --fail $CONFIG_URL > /etc/otel/collector/ecs_ec2_config.yaml && exec /otelcol"
],
"environment": [
...
{
"name": "CONFIG_URL",
"value": "https://raw.githubusercontent.com/InhoJung/custom-splunk-otel-collector/main/ecs_ec2_config/updated_ecs_ec2_config.yaml"
}
...
]

 

https://raw.githubusercontent.com/InhoJung/custom-splunk-otel-collector/main/ecs_ec2_config/updated_ecs_ec2_config.yaml <--- 이곳에 커스터마이징할 ecs_ec2_config.yaml 파일을 저장하고, curl 명령으로 default 파일  /etc/otel/collector/ecs_ec2_config.yaml 에 overwrite 합니다. 이후 exec 명령으로 splunk otel collector를 재기동하는 것입니다.

따라서 이렇게 하기 위해서는 splunk otel collector 버전이 지원하는 default config yaml 파일을 복사하여 커스터마이징 해야 합니다.

splunk-otel-collector 버전은 계속 증가할 텐데, 제 블로그의 config 값을 그대로 사용한다면 문제가 생길 것입니다.

 

아래 task definition은 저의 github에 커스터마이징한 ecs_ec2_config.yaml로 기동하는 예제 입니다. (사이드카 방식)

{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:432274630114:task-definition/factorial-task:26",
    "containerDefinitions": [
        {
            "name": "factorial",
            "image": "public.ecr.aws/e7b5k4u7/factorial",
            "cpu": 1024,
            "links": [
                "splunk-otel-collector"
            ],
            "portMappings": [
                {
                    "name": "forwader8080",
                    "containerPort": 8080,
                    "hostPort": 8080,
                    "protocol": "tcp",
                    "appProtocol": "http"
                },
                {
                    "name": "forwarder80",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [
                {
                    "name": "OTEL_SERVICE_NAME",
                    "value": "InhoFactorialService"
                },
                {
                    "name": "OTEL_RESOURCE_ATTRIBUTES",
                    "value": "deployment.environment=INHO,service.version=1.0.0"
                },
                {
                    "name": "OTEL_JAVAAGENT_DEBUG",
                    "value": "true"
                },
                {
                    "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
                    "value": "http://172.17.0.1:4317"
                },
                {
                    "name": "SPLUNK_METRICS_ENDPOINT",
                    "value": "http://172.17.0.1:9943"
                }
            ],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/factorial-task",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "ecs"
                }
            },
            "systemControls": []
        },
        {
            "name": "splunk-otel-collector",
            "image": "quay.io/signalfx/splunk-otel-collector:latest",
            "cpu": 512,
            "memory": 512,
            "portMappings": [
                {
                    "containerPort": 4317,
                    "hostPort": 4317,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "curl --fail $CONFIG_URL > /etc/otel/collector/ecs_ec2_config.yaml && exec /otelcol"
            ],
            "environment": [
                {
                    "name": "METRICS_TO_EXCLUDE",
                    "value": "[]"
                },
                {
                    "name": "HOST_DEV",
                    "value": "/hostfs/dev"
                },
                {
                    "name": "HOST_ETC",
                    "value": "/hostfs/etc"
                },
                {
                    "name": "SPLUNK_CONFIG",
                    "value": "/etc/otel/collector/ecs_ec2_config.yaml"
                },
                {
                    "name": "SPLUNK_REALM",
                    "value": "us1"
                },
                {
                    "name": "HOST_PROC",
                    "value": "/hostfs/proc"
                },
                {
                    "name": "SPLUNK_ACCESS_TOKEN",
                    "value": "토큰"
                },
                {
                    "name": "HOST_SYS",
                    "value": "/hostfs/sys"
                },
                {
                    "name": "HOST_RUN",
                    "value": "/hostfs/run"
                },
                {
                    "name": "ECS_METADATA_EXCLUDED_IMAGES",
                    "value": "[\"quay.io/signalfx/splunk-otel-collector\"]"
                },
                {
                    "name": "HOST_VAR",
                    "value": "/hostfs/var"
                },
                {
                    "name": "CONFIG_URL",
                    "value": "https://raw.githubusercontent.com/InhoJung/custom-splunk-otel-collector/main/ecs_ec2_config/updated_ecs_ec2_config.yaml"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "hostfs",
                    "containerPath": "/hostfs",
                    "readOnly": true
                }
            ],
            "volumesFrom": [],
            "systemControls": []
        }
    ],
    "family": "factorial-task",
    "taskRoleArn": "arn:aws:iam::432274630114:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::432274630114:role/ecsTaskExecutionRole",
    "networkMode": "bridge",
    "revision": 26,
    "volumes": [
        {
            "name": "hostfs",
            "host": {
                "sourcePath": "/"
            }
        }
    ],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2"
    ],
    "requiresCompatibilities": [
        "EC2"
    ],
    "cpu": "2048",
    "memory": "6072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "registeredAt": "2024-03-23T12:21:22.856Z",
    "registeredBy": "arn:aws:sts::432274630114:assumed-role/AWSReservedSSO_SPLKAdministratorAccess_06c8810013bb6e59/ijung@splunk.com",
    "tags": []
}

1초 단위로 매트릭 수집

 

[config file 변경되었는지 확인 여부]

EC2 instance에 ssh 접속.

저는 session manager로 접속하였습니다.

sudo docker ps -a

splunk otel collector 컨테이너 ID 를 확인하고 아래처럼 입력해보면, 변경한 yaml 파일을 확인해볼 수 있습니다.

eaad009024cc 는 docker ps -a 명령으로 확인한 컨테이너 id 입니다.

sudo docker exec -it eaad009024cc cat /etc/otel/collector/ecs_ec2_config.yaml

이 명령의 부연설명을 하자면, eaad009024cc 컨테이너 환경게 접속해서, "cat /etc/otel/collector/ecs_ec2_config.yaml" linux 명령을 수행한 것입니다.

 

 

 

반응형