このリポジトリには、Java アプリケーション( Web サービス)のソースコードが含まれています。
そのアプリケーションを Docker Compose または Google Kubernetes Engine( GKE )を使用して実行するためのソースコードも含まれています。
また、アプリケーション以外に以下のコンテナおよびサービスも実行されます。
- Datadog Agent コンテナ
- PostgreSQL コンテナ( Docker Compose の場合のみ)
- Jenkins コンテナ( Docker Compose の場合のみ)
- Cloud SQL for PostgreSQL( GKE の場合のみ)
- Web フレームワークとして、Spring Boot を使用しています。
- HTTP リクエストの内容を PostgreSQL に登録します。
- ログは、Datadog でパースされるように JSON 形式で出力するように設定しています。
mvn test
コマンドを実行することで、単体テストを実行できます。
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 をインストールしてください。インストール方法については、こちらのドキュメントを参照してください。
- このリポジトリの Datadog Agent コンテナは、Docker Compose を使用する場合、Mac OS でのみ実行可能です。
.env
ファイルの DD_API_KEY
に Datadog の API キーを設定してください。
compose.yaml が存在するディレクトリで以下のコマンドを実行してください。
docker-compose up -d --build
アプリケーションコンテナに HTTP リクエストを送信するには、以下のコマンドを実行してください。
curl -v -X POST -H 'Content-Type:application/json' -d '{"message":"Hello", "target":"Kagetaka"}' 127.0.0.1:8080/greeting
Jenkins にアクセスするための URL は、http://localhost:8888 です。
Jenkins にアクセスするためのユーザー名とパスワードは、Jenkins コンテナ起動時のログに出力されます。
compose.yaml が存在するディレクトリで以下のコマンドを実行してください。
docker-compose down
- こちらのドキュメントを参考に Docker をインストールしてください。
- マルチプラットフォームコンテナイメージを作成するために、こちらのドキュメントを参考に Docker Desktop の
Use containerd for pulling and storing images
を有効化してください。 - こちらのドキュメントを参考に
Helm
をインストールしてください。 - こちらのドキュメントを参考に
Terraform
をインストールしてください。 - その他の前提条件については、こちらのドキュメントを参照してください。
- こちらのドキュメントを参考に
gke-gcloud-auth-plugin
をインストールしてください。
.env
ファイルの DD_API_KEY
に Datadog の API キーを設定してください。
terraform/terraform.tfvars
ファイルを以下のとおりに変更してください。
project_id
に Google Could のプロジェクト ID を設定してください。- Google Cloud リソース名の重複を避けるために、
env
に任意の値を設定してください。 - こちらのサイトでグローバル IP アドレスを確認し、
your_global_ip_address
にグローバル IP アドレスを設定してください。
任意のディレクトリで以下のコマンドを実行してください。
gcloud services enable \
artifactregistry.googleapis.com \
container.googleapis.com \
sqladmin.googleapis.com
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
terraform apply
コマンドの実行結果をもとに k8s/manifests.yaml
ファイルを以下のとおりに変更してください。
変更箇所には、# REPLACE ME
というコメントが記載されています。
spec.template.spec.containers.name=app
のimage
に${region}-docker.pkg.dev/${project_id}/${artifact_registry_repository_name}/example-app-with-datadog-app:latest
を設定してください。spec.template.spec.containers.name=cloud-sql-proxy
のargs[2]
に${project_id}:${region}:${cloud_sql_instance_name}
を設定してください。
metadata.annotations.kubernetes.io/ingress.global-static-ip-name
に${global_ip_address_name}
を設定してください。
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
リクエスト送信先のグローバル 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
k8s
ディレクトリで以下のコマンドを実行してください。
kubectl delete -f manifests.yaml -f service-account.yaml -f datadog-agent.yaml
terraform
ディレクトリで以下のコマンドを実行してください。
terraform destroy