Log Analytics 데모에서는 Google Cloud 의 Online Boutique 를 사용해보겠습니다.
Online Boutique 는 11티어 서비스로 구성된 데모용 EC 사이트입니다. 구글에서는 이 어플리케이션을 사용해서 K8s/GKE, Istio, Operations Suites 그리고 gRPC 데모를 실시합니다.
각 서비스는 서로 다른 언어로 만들어졌으며, 상호간에는 gRPC 로 통신합니다.
# Cloud Skills Boost 의 프로젝트 사용
gcloud auth list
gcloud config list project
gcloud config set compute/zone us-central1-a
gcloud container clusters list
# 클러스터 크레덴션 취득
gcloud container clusters get-credentials day2-ops --region us-central1
kubectl get nodes
# Online Boutique 를 배포
git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
cd microservices-demo
kubectl apply -f release/kubernetes-manifests.yaml
kubectl get pods
export EXTERNAL_IP=$(kubectl get service frontend-external -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
echo $EXTERNAL_IP
curl -o /dev/null -s -w "%{http_code}\n" http://${EXTERNAL_IP}
Log Analytic를 사용하기 위해서는 Log Analytics용 버킷을 사용합니다. 이 버킷 설정에는 두가지 방법이 있습니다.
버킷을 생성했으면, Logs Router 의 inclusive filters & exclusive filters 을 설정해서 어떤 로그가 해당 버킷으로 흘러가게할지 설정합니다.
이제 Logs Explorer 에서는 REFINE SCOPE을 사용해서 해당 버킷에서만 읽어들일 수 있고, Log Analytics를 사용하기 위한 준비 또한 끝났습니다.
아래와 같은 SQL로 frontend 서비스의 min, max, and average latencies를 분석해보는것이 가능합니다.
SELECT
hour,
MIN(took_ms) AS min,
MAX(took_ms) AS max,
AVG(took_ms) AS avg
FROM (
SELECT
FORMAT_TIMESTAMP("%H", timestamp) AS hour,
CAST( JSON_VALUE(json_payload,
'$."http.resp.took_ms"') AS INT64 ) AS took_ms
FROM
`버킷의 주소`
WHERE
timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND json_payload IS NOT NULL
AND SEARCH(labels,
"frontend")
AND JSON_VALUE(json_payload.message) = "request complete"
ORDER BY
took_ms DESC,
timestamp ASC )
GROUP BY
1
ORDER BY
1
RESTful API 를 활용하는 경우, 아래와 같이 특정 프로덕트 페이지가 몇 번 호출되었는지 확인 가능합니다.
SELECT
count(*)
FROM
`버킷 주소`
WHERE
text_payload like "GET %/product/L9ECAV7KIM %"
AND
timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
또는, checkout 까지 진행된 세션이 몇 개 있었는지 확인하는 것도 가능합니다.
SELECT
JSON_VALUE(json_payload.session),
COUNT(*)
FROM
`버킷 주소`
WHERE
JSON_VALUE(json_payload['http.req.method']) = "POST"
AND JSON_VALUE(json_payload['http.req.path']) = "/cart/checkout"
AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
GROUP BY
JSON_VALUE(json_payload.session)