ogu1101 / example-app-with-datadog

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Datadog を使用したサンプルアプリケーション

概要

このリポジトリには、Java アプリケーション( Web サービス)のソースコードが含まれています。

そのアプリケーションを Docker Compose または Google Kubernetes Engine( GKE )を使用して実行するためのソースコードも含まれています。

また、アプリケーション以外に以下のコンテナおよびサービスも実行されます。

  • Datadog Agent コンテナ
  • PostgreSQL コンテナ( Docker Compose の場合のみ)
  • Jenkins コンテナ( Docker Compose の場合のみ)
  • Cloud SQL for PostgreSQL( GKE の場合のみ)

アーキテクチャ ( Docker Compose )

doc/architecture-localhost.drawio.png

アーキテクチャ ( GKE )

doc/architecture-gke.drawio.png

アプリケーションについて

  • Web フレームワークとして、Spring Boot を使用しています。
  • HTTP リクエストの内容を PostgreSQL に登録します。
  • ログは、Datadog でパースされるように JSON 形式で出力するように設定しています。
  • mvn test コマンドを実行することで、単体テストを実行できます。

有効化されている Datadog 機能

CI Visibility 以外は、手動作業なしに以下の Datadog 機能が有効化されます。

CI Visibility を有効化するには、手動で Jenkins への Datadog プラグイン導入および Jenkins ジョブの作成を行う必要があります。

  • Live Processes
  • Application Performance Monitoring
  • Continuous Profiler
  • Log Management(トレースと接続済み)
  • Application Security Management
  • CI Visibility( Docker Compose の場合のみ)
  • Database Monitoring(トレースと接続済み、Docker Compose の場合のみ)
  • Network Performance Monitoring( GKE の場合のみ)
  • Universal Service Monitoring( GKE の場合のみ)

ビルドと実行 ( Docker Compose を使用する場合)

前提条件

  • Docker をインストールしてください。インストール方法については、こちらのドキュメントを参照してください。
  • このリポジトリの Datadog Agent コンテナは、Docker Compose を使用する場合、Mac OS でのみ実行可能です。

事前作業

.env ファイルの DD_API_KEY に Datadog の API キーを設定してください。

コンテナの起動

compose.yaml が存在するディレクトリで以下のコマンドを実行してください。

docker-compose up -d --build

HTTP リクエストの送信

アプリケーションコンテナに HTTP リクエストを送信するには、以下のコマンドを実行してください。

curl -v -X POST -H 'Content-Type:application/json' -d '{"message":"Hello", "target":"Kagetaka"}' 127.0.0.1:8080/greeting

Jenkins

Jenkins にアクセスするための URL は、http://localhost:8888 です。

Jenkins にアクセスするためのユーザー名とパスワードは、Jenkins コンテナ起動時のログに出力されます。

コンテナの停止

compose.yaml が存在するディレクトリで以下のコマンドを実行してください。

docker-compose down

ビルドと実行( GKE を使用する場合)

前提条件

  • こちらのドキュメントを参考に Docker をインストールしてください。
  • マルチプラットフォームコンテナイメージを作成するために、こちらのドキュメントを参考に Docker Desktop の Use containerd for pulling and storing images を有効化してください。
  • こちらのドキュメントを参考に Helm をインストールしてください。
  • こちらのドキュメントを参考に Terraform をインストールしてください。
  • その他の前提条件については、こちらのドキュメントを参照してください。
  • こちらのドキュメントを参考に gke-gcloud-auth-plugin をインストールしてください。

事前作業

.env ファイルの DD_API_KEY に Datadog の API キーを設定してください。

terraform.tfvars の変更

terraform/terraform.tfvars ファイルを以下のとおりに変更してください。

  • project_id に Google Could のプロジェクト ID を設定してください。
  • Google Cloud リソース名の重複を避けるために、env に任意の値を設定してください。
  • こちらのサイトでグローバル IP アドレスを確認し、your_global_ip_address にグローバル IP アドレスを設定してください。

各種 Google Cloud API の有効化

任意のディレクトリで以下のコマンドを実行してください。

gcloud services enable \
    artifactregistry.googleapis.com \
    container.googleapis.com \
    sqladmin.googleapis.com

Google Cloud リソースの作成

terraform ディレクトリで以下のコマンドを実行してください。

terraform init
terraform apply

terraform apply コマンド実行時に、以下のような値が出力されます。

artifact_registry_repository_name = "shuhei-repository"
cloud_sql_instance_name = "shuhei-cloud-sql"
global_ip_address_name = "shuhei-ip-address"
kubernetes_cluster_name = "shuhei-gke"
project_id = "datadog-sandbox"
region = "us-central1"
service_account_id = "shuhei-service-account-id"

アプリケーションコンテナイメージのビルドとプッシュ

terraform apply コマンドの実行結果をもとに以下のコマンドを変更してください。

Dockerfile が存在するディレクトリで以下のコマンドを実行してください。

gcloud auth configure-docker ${region}-docker.pkg.dev

docker buildx build . \
    -t ${region}-docker.pkg.dev/${project_id}/${artifact_registry_repository_name}/example-app-with-datadog-app:latest \
    --platform linux/amd64,linux/arm64 \
    --build-arg DD_GIT_REPOSITORY_URL=github.com/ogu1101/example-app-with-datadog \
    --build-arg DD_GIT_COMMIT_SHA=$(git rev-parse HEAD)

docker push ${region}-docker.pkg.dev/${project_id}/${artifact_registry_repository_name}/example-app-with-datadog-app:latest

コマンドの例は、以下のとおりです。

gcloud auth configure-docker us-central1-docker.pkg.dev

docker buildx build . \
    -t us-central1-docker.pkg.dev/datadog-sandbox/shuhei-repository/example-app-with-datadog-app:latest \
    --platform linux/amd64,linux/arm64 \
    --build-arg DD_GIT_REPOSITORY_URL=github.com/ogu1101/example-app-with-datadog \
    --build-arg DD_GIT_COMMIT_SHA=$(git rev-parse HEAD)

docker push us-central1-docker.pkg.dev/datadog-sandbox/shuhei-repository/example-app-with-datadog-app:latest

manifests.yaml の変更

terraform apply コマンドの実行結果をもとに k8s/manifests.yaml ファイルを以下のとおりに変更してください。

変更箇所には、# REPLACE ME というコメントが記載されています。

Deployment リソース

  • spec.template.spec.containers.name=appimage${region}-docker.pkg.dev/${project_id}/${artifact_registry_repository_name}/example-app-with-datadog-app:latest を設定してください。
  • spec.template.spec.containers.name=cloud-sql-proxyargs[2]${project_id}:${region}:${cloud_sql_instance_name} を設定してください。

Ingress リソース

  • metadata.annotations.kubernetes.io/ingress.global-static-ip-name${global_ip_address_name} を設定してください。

Kubernetes リソースのデプロイ

terraform apply コマンドの実行結果をもとに以下のコマンドを変更してください。

また、${API-KEY} には、Datadog の API キーを、${APP-KEY} には、Datadog の APP キーを設定してください。

k8s ディレクトリで以下のコマンドを実行してください。

gcloud container clusters get-credentials --zone ${region} ${kubernetes_cluster_name}

helm repo add datadog https://helm.datadoghq.com

helm install datadog-operator datadog/datadog-operator

kubectl create secret generic datadog-secret --from-literal api-key=${API-KEY} --from-literal app-key=${APP-KEY}

kubectl apply -f datadog-agent.yaml -f service-account.yaml

kubectl annotate serviceaccount \
  ksa-cloud-sql  \
  iam.gke.io/gcp-service-account=${service_account_id}@${project_id}.iam.gserviceaccount.com

kubectl apply -f manifests.yaml

gcloud container clusters get-credentials コマンドの例は、以下のとおりです。

gcloud container clusters get-credentials --zone us-central1 shuhei-gke

kubectl annotate serviceaccount コマンドの例は、以下のとおりです。

kubectl annotate serviceaccount \
  ksa-cloud-sql  \
  iam.gke.io/gcp-service-account=shuhei-service-account-id@datadog-sandbox.iam.gserviceaccount.com

HTTP リクエストの送信

リクエスト送信先のグローバル IP アドレスを確認するために、kubectl get service app コマンドを実行してください。

実行結果の例は、以下のとおりです。

shuhei.ogura@COMP-R7QQCTJ177 k8s % kubectl get service app
NAME   TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)          AGE
app    LoadBalancer   10.187.247.149   35.238.101.70   8080:31303/TCP   38h

以下コマンドの ${EXTERNAL-IP} を上記の EXTERNAL-IP に置換したうえで、以下コマンドを実行してください。

curl -v -X POST -H 'Content-Type:application/json' -d '{"message":"Hello", "target":"Kagetaka"}' ${EXTERNAL-IP}:8080/greeting

コマンドの例は、以下のとおりです。

curl -v -X POST -H 'Content-Type:application/json' -d '{"message":"Hello", "target":"Kagetaka"}' 35.238.101.70:8080/greeting

Kubernetes リソースの削除

k8s ディレクトリで以下のコマンドを実行してください。

kubectl delete -f manifests.yaml -f service-account.yaml -f datadog-agent.yaml

Google Cloud リソースの削除

terraform ディレクトリで以下のコマンドを実行してください。

terraform destroy

References

About


Languages

Language:Java 40.3%Language:HCL 40.2%Language:Dockerfile 15.3%Language:PLpgSQL 4.1%