[AWS] X-Ray

[์›๋ณธ ๋งํฌ]

X-ray๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” Trace ์ˆ˜์ง‘ ๋ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค.
API ๋‹จ์œ„ ๊ฐ™์€ ๊ฐœ๋ณ„ Trace(Transaction) ๋‹จ์œ„์˜ ๊ด€์ธก์„ ์™ธ๋ถ€ APM ์—†์ด AWS ๋‚ด์—์„œ ์ž์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ด๋Ÿฐ๊ฑฐ๋‹ค.

๊ทธ๋ฆฌ๊ณ  OpenTelemetry ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฑฐ๋ผ์„œ, ๋‹ค๋ฅธ Otel ๋„๊ตฌ๋“ค๊ณผ ์–ด๋А ์ •๋„ ํ˜ธํ™˜๋œ๋‹ค.




๋น„์šฉ

๊ฐ€๊ฒฉ์€ ๊ทธ๋ƒฅ ์ ๋‹นํ•œ ํŽธ์ด๋‹ค. DataDog ๊ฐ™์€ ๊ฐ•๋„๋“ค์— ๋น„ํ•˜๋ฉด ์‹ธ๊ณ , ์ง์ ‘ ๊ตฌ์ถ•ํ•ด์„œ ์“ฐ๋Š” ๊ฒƒ์— ๋น„ํ•˜๋ฉด ๋น„์‹ธ๋‹ค.
https://aws.amazon.com/ko/cloudwatch/pricing/

๊ธฐ๋ก ๊ด€์ ์—์„œ ๋ณด๋ฉด 100๋งŒ๊ฐœ๋‹น $5๊ฐ€ ๋‚˜๊ฐ„๋‹ค. Trace๊ฐ€ ๋งŽ๋‹ค๋ฉด ๊ธˆ๋ฐฉ ๋น„์šฉ์ด ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋‹ค.


๋ฌด๋ฃŒ ์‚ฌ์šฉ๋Ÿ‰๋„ ์ข€ ์žˆ๋‹ค.




๊ธฐ๋ณธ

์ฝ˜์†”์—์„œ X-ray๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Cloudwatch ์„น์…˜์˜ ํ•˜์œ„ ํƒญ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ € X-ray ๊ทธ๋ฃน์€ ์ตœ์ƒ์œ„ ํ•„ํ„ฐ ๋‹จ์œ„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต ์„œ๋น„์Šค ์ด๋ฆ„ ๊ฐ™์€๊ฑธ ์ €๊ธฐ์— ๋ฐ•๋Š”๋ฐ, ์ด๊ฑด AWS CLI๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

aws xray create-group \
  --region ap-northeast-2 \
  --group-name just-test-api \
  --filter-expression 'service("just-test-api")'




์•ฑ ์—์ด์ „ํŠธ ๊ตฌ์„ฑ (docker compose)

์•ฑ์—์„œ Trace๋ฅผ ์ ์žฌํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ „์šฉ Otel SDK๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
X-ray ์ „์šฉ ์—์ด์ „ํŠธ ๊ตฌ์„ฑ์ด ์žˆ๊ธด ํ•œ๋ฐ, deprecated๋œ ์ƒํƒœ๋ผ์„œ ๊ถŒ์žฅํ•˜์ง„ ์•Š๋Š”๋‹ค.

๋จผ์ € otel collector๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด๊ฒŒ x-ray๋ฅผ ๋ณด๋‚ด๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง„๋‹ค.
config ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ 

vim otel-collector-config.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch/traces:

exporters:
  awsxray:
    region: ${env:AWS_REGION}

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch/traces]
      exporters: [awsxray]

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ otel collector๋ฅผ ์ •์˜ํ•œ๋‹ค.

services:
...
  adot-collector:
    image: public.ecr.aws/aws-observability/aws-otel-collector:latest
    command: ["--config=/etc/otel-agent-config.yaml"]
    environment:
      AWS_PROFILE: ${AWS_PROFILE:-...-dev}
      AWS_REGION: ${AWS_REGION:-ap-northeast-2}
      AWS_CONFIG_FILE: /home/aoc/.aws/config
      AWS_SHARED_CREDENTIALS_FILE: /home/aoc/.aws/credentials
    volumes:
      # ADOT image runs as the non-root `aoc` user (HOME=/home/aoc).
      - ${HOME}/.aws:/home/aoc/.aws:ro
      - ./otel-collector-config.yaml:/etc/otel-agent-config.yaml:ro
    ports:
      - "4317:4317"
      - "4318:4318"
    restart: unless-stopped

๊ทธ๋ฆฌ๊ณ  ๋ฉ”์ธ ์•ฑ์—์„œ๋Š” otel collector์˜ ๊ฒฝ๋กœ๋กœ ์ฐ”๋Ÿฌ์„œ trace๋ฅผ ๋– ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค.
๋‹ค์Œ์€ node.js/express์˜ ๊ตฌ์„ฑ ์˜ˆ์‹œ๋‹ค.

import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { AWSXRayIdGenerator } from '@opentelemetry/id-generator-aws-xray';
import { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';

export const telemetrySdk = new NodeSDK({
  serviceName: process.env.OTEL_SERVICE_NAME ?? 'just-test-api',
  traceExporter: new OTLPTraceExporter({
    url: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
      ?? 'http://localhost:4318/v1/traces',
  }),
  idGenerator: new AWSXRayIdGenerator(),
  textMapPropagator: new AWSXRayPropagator(),
  instrumentations: [getNodeAutoInstrumentations()],
});

telemetrySdk.start();

์–ธ์–ด๋ณ„ ๊ตฌ์„ฑ๋ฐฉ๋ฒ• ๋“ฑ์€ ๋ณ„๋„ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://aws-otel.github.io/docs/introduction

๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ํ•ด์„œ ๋Œ๋ ค๋ณด๋ฉด

์ด๋Ÿฐ ์‹์œผ๋กœ Trace๊ฐ€ ์ž”๋œฉ ์Œ“์ผ ๊ฒƒ์ด๋‹ค.

Trace ์ƒ์„ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ๋“ค์–ด๊ฐ€๋ฉด ์ด๋Ÿฐ์ €๋Ÿฐ ์ •๋ณด๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


ํ•˜์œ„ Span ๋‹จ์œ„ ๋ ˆ์ดํ„ด์‹œ & ์ƒํƒœ ์ •๋ณด๋„ ๋ณผ ์ˆ˜ ์žˆ๊ณ 


๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐ’๋“ค๋„ ๊ด€์ธก์ด ๋œ๋‹ค.

์ƒ๋‹จ ํƒญ์—์„œ๋Š” ์†์„ฑ๋ณ„ ํ†ต๊ณ„๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐ์–ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.




Trace Map

Trace๋ฅผ ์Œ“์œผ๋ฉด, ์„ธํŒ…๋œ ์†์„ฑ๊ฐ’๋“ค ๊ธฐ์ค€์œผ๋กœ ์„œ๋น„์Šค๊ฐ„ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๋„์‹ํ™”ํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
Trace Map ํƒญ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋œ๋‹ค.




Error ํ•ธ๋“ค๋ง

๋‹ค๋ฅธ Otel ๋„๊ตฌ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์˜ค๋ฅ˜๋ฅผ Trace์˜ ํ•˜์œ„ ์†์„ฑ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด์—์„œ Error๊ฐ€ ๋–จ์–ด์ง€๋ฉด ์—๋Ÿฌ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์•Œ์•„์„œ ํ•ด์ฃผ๋Š”๋ฐ, ์›ํ•œ๋‹ค๋ฉด ์ˆ˜๋™์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์บก์ณํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์•„๋ฌดํŠผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ๋ณด๋ฉด

์‹ค์ œ๋กœ Trace๊ฐ€ ์—๋Ÿฌ ์ƒํƒœ๋กœ ๊ธฐ๋ก๋  ๊ฒƒ์ด๋‹ค.

์ด ์ž์ฒด๋กœ ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ๋ณ„๋กœ ์—†๋‹ค. ์˜ค๋ฅ˜๋ผ๋Š” ์ƒํƒœ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ๋ฟ์ด๋‹ค.

์ฝ˜์†”์—์„œ ์˜ค๋ฅ˜๋งŒ ๊ฒ€์ƒ‰ํ•ด์„œ ๋ณด๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ์กฐ๊ฑด์„ ์ฃผ๋ฉด ๋œ๋‹ค.



์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/xray/latest/devguide/aws-xray.html
https://docs.aws.amazon.com/ko_kr/xray/latest/devguide/xray-concepts.html
https://docs.aws.amazon.com/ko_kr/xray/latest/devguide/xray-gettingstarted.html