From 7a0f121e9f0da92a026325b14aac20ca38fbc741 Mon Sep 17 00:00:00 2001 From: Tao Guo Date: Fri, 7 Jul 2023 14:08:51 +1000 Subject: [PATCH] Add GHA for testing and releasing promql-to-dd-go image --- .github/workflows/promql-to-dd-go.yaml | 24 ++++++++ .../promql-to-dd-go_build-publish.yaml | 50 ++++++++++++++++ .github/workflows/promql-to-dd-go_test.yaml | 26 +++++++++ .../observability/promql-to-dd-go/.gitignore | 1 - .../promql-to-dd-go/cmd/promqltodd/main.go | 58 +++++++++++++++++++ 5 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/promql-to-dd-go.yaml create mode 100644 .github/workflows/promql-to-dd-go_build-publish.yaml create mode 100644 .github/workflows/promql-to-dd-go_test.yaml delete mode 100644 cloud/observability/promql-to-dd-go/.gitignore create mode 100644 cloud/observability/promql-to-dd-go/cmd/promqltodd/main.go diff --git a/.github/workflows/promql-to-dd-go.yaml b/.github/workflows/promql-to-dd-go.yaml new file mode 100644 index 0000000..99abbb0 --- /dev/null +++ b/.github/workflows/promql-to-dd-go.yaml @@ -0,0 +1,24 @@ +name: Test, build and publish promql-to-dd-go + +on: + push: + paths: + - 'cloud/observability/promql-to-dd-go/**' + - '!cloud/observability/promql-to-dd-go/examples/**' + - '!cloud/observability/promql-to-dd-go/helm-charts/**' + branches: + - main + tags: + - v* + pull_request: + paths: + - 'cloud/observability/promql-to-dd-go/**' + - '!cloud/observability/promql-to-dd-go/examples/**' + - '!cloud/observability/promql-to-dd-go/helm-charts/**' + +jobs: + test: + uses: ./.github/workflows/promql-to-dd-go_test.yaml + push: + needs: test + uses: ./.github/workflows/promql-to-dd-go_build-publish.yaml diff --git a/.github/workflows/promql-to-dd-go_build-publish.yaml b/.github/workflows/promql-to-dd-go_build-publish.yaml new file mode 100644 index 0000000..f93329b --- /dev/null +++ b/.github/workflows/promql-to-dd-go_build-publish.yaml @@ -0,0 +1,50 @@ +name: Build and push Docker image + +on: + workflow_call: + +env: + IMAGE_NAME: promql-to-dd-go + +jobs: + push: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to registry + # This is where you will update the personal access token to GITHUB_TOKEN + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin + + - name: Setup Docker metadata + id: meta + uses: docker/metadata-action@v4 + with: + images: | + ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=latest,enable={{is_default_branch}} + type=raw,value={{branch}} + type=ref,event=branch + type=ref,event=pr + type=sha + + - name: Build and Push + uses: docker/build-push-action@v3 + with: + context: cloud/observability/promql-to-dd-go + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 + push: true diff --git a/.github/workflows/promql-to-dd-go_test.yaml b/.github/workflows/promql-to-dd-go_test.yaml new file mode 100644 index 0000000..fc53626 --- /dev/null +++ b/.github/workflows/promql-to-dd-go_test.yaml @@ -0,0 +1,26 @@ +name: Test + +on: + workflow_call: + +jobs: + test: + strategy: + fail-fast: true + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Print build information + run: 'echo head_ref: ${{ github.head_ref }}, ref: ${{ github.ref }}, os: ${{ matrix.os }}' + - uses: actions/checkout@v2 + - name: Set up Go + uses: actions/setup-go@v3.0.0 + with: + go-version: '1.20' + - name: build + working-directory: cloud/observability/promql-to-dd-go + run: make build + - name: test + working-directory: cloud/observability/promql-to-dd-go + run: make test diff --git a/cloud/observability/promql-to-dd-go/.gitignore b/cloud/observability/promql-to-dd-go/.gitignore deleted file mode 100644 index e0d6f21..0000000 --- a/cloud/observability/promql-to-dd-go/.gitignore +++ /dev/null @@ -1 +0,0 @@ -promqltodd diff --git a/cloud/observability/promql-to-dd-go/cmd/promqltodd/main.go b/cloud/observability/promql-to-dd-go/cmd/promqltodd/main.go new file mode 100644 index 0000000..89f9208 --- /dev/null +++ b/cloud/observability/promql-to-dd-go/cmd/promqltodd/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "flag" + "log" + "os" + "time" + + "github.com/temporalio/promql-to-dd-go/datadog" + "github.com/temporalio/promql-to-dd-go/prometheus" + "github.com/temporalio/promql-to-dd-go/worker" +) + +func main() { + set := flag.NewFlagSet("app", flag.ExitOnError) + promURL := set.String("prom-endpoint", "", "Prometheus API endpoint for the server") + serverRootCACert := set.String("server-root-ca-cert", "", "Optional path to root server CA cert") + clientCert := set.String("client-cert", "", "Required path to client cert") + clientKey := set.String("client-key", "", "Required path to client key") + serverName := set.String("server-name", "", "Server name to use for verifying the server's certificate") + insecureSkipVerify := set.Bool("insecure-skip-verify", false, "Skip verification of the server's certificate and host name") + matrixPrefix := set.String("matrix-prefix", "temporal_cloud_", "Prefix of the metrics to be queried and send to Datadog") + stepDuration := set.Int("step-duration-seconds", 60, "The step between metrics") + queryInterval := set.Int("query-interval-seconds", 600, "Interval between each Prometheus query") + + if err := set.Parse(os.Args[1:]); err != nil { + log.Fatalf("failed parsing args: %s", err) + } else if *clientCert == "" || *clientKey == "" { + log.Fatalf("-client-cert and -client-key are required") + } + + datadogClient := datadog.NewAPIClient() + + prometheusClient, err := prometheus.NewAPIClient( + prometheus.Config{ + TargetHost: *promURL, + ServerRootCACert: *serverRootCACert, + ClientCert: *clientCert, + ClientKey: *clientKey, + ServerName: *serverName, + InsecureSkipVerify: *insecureSkipVerify, + }, + ) + if err != nil { + log.Fatalf("Failed to create Prometheus client: %s", err) + } + + worker := worker.Worker{ + Querier: prometheusClient, + Submitter: datadogClient, + MetricPrefix: *matrixPrefix, + StepDuration: time.Duration(*stepDuration) * time.Second, + QueryInterval: time.Duration(*queryInterval) * time.Second, + Quantiles: []float64{0.5, 0.9, 0.95, 0.99}, + } + + worker.Run() +}