From 108458682e78d188448c381ba17cebc0c30a9c44 Mon Sep 17 00:00:00 2001 From: thuanle Date: Thu, 7 Nov 2024 09:08:19 +0700 Subject: [PATCH] add Metric --- .gitea/workflows/docker-build.yml | 71 ++++++++++++++++++++++++ Dockerfile | 2 +- internal/services/api/handler_metrics.go | 13 +++++ internal/services/api/main.go | 1 + internal/services/db_updater/main.go | 5 ++ 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 .gitea/workflows/docker-build.yml create mode 100644 internal/services/api/handler_metrics.go diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml new file mode 100644 index 0000000..822fe1b --- /dev/null +++ b/.gitea/workflows/docker-build.yml @@ -0,0 +1,71 @@ +name: Build Docker Image +on: + push: + branches: + - main +env: + IMAGE_PATH: git.thuanle.me/public/ip-info + +jobs: + build: + strategy: + matrix: + arch: + - amd64 + - arm64 + runs-on: ${{ matrix.arch }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch full history, keeping all commits + + - name: Get commit count + id: get_commit_count + run: | + COMMIT_COUNT=$(git rev-list --count HEAD) + echo "COMMIT_COUNT=${COMMIT_COUNT}" >> $GITHUB_ENV + + - name: Login to Docker Registry + uses: docker/login-action@v3 + with: + registry: git.thuanle.me + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build Docker images + run: | + echo "Building image for architecture: ${{ matrix.arch }}" + + docker build \ + -f Dockerfile \ + -t ${{ env.IMAGE_PATH }}:${{ matrix.arch }}-latest \ + --label "version=${{ env.COMMIT_COUNT }}" \ + --label "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ + --label "commit_sha=${{ github.sha }}" \ + . + + docker push ${{ env.IMAGE_PATH }}:${{ matrix.arch }}-latest + + amend-manifest: + runs-on: ubuntu-latest + needs: [build] + steps: + - name: Login to Docker Registry + uses: docker/login-action@v3 + with: + registry: git.thuanle.me + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Push Docker manifest + run: | + echo "Delete existing manifest" + docker manifest rm ${{ env.IMAGE_PATH }}:latest || true + + echo "Create new manifest" + docker manifest create ${{ env.IMAGE_PATH }}:latest \ + ${{ env.IMAGE_PATH }}:amd64-latest \ + ${{ env.IMAGE_PATH }}:arm64-latest + + docker manifest push ${{ env.IMAGE_PATH }}:latest \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 4a5c111..f099504 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Cache dependency -FROM golang:1.22-alpine AS go-mod-cache +FROM golang:1.22 AS go-mod-cache WORKDIR /app diff --git a/internal/services/api/handler_metrics.go b/internal/services/api/handler_metrics.go new file mode 100644 index 0000000..904d3d6 --- /dev/null +++ b/internal/services/api/handler_metrics.go @@ -0,0 +1,13 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "net/http" + "thuanle.me/ip-info/internal/services/db_updater" +) + +func HandleMetrics(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "updated_at": db_updater.DbUpdatedAt.UnixMilli(), + }) +} diff --git a/internal/services/api/main.go b/internal/services/api/main.go index 64c8d21..943ffd0 100644 --- a/internal/services/api/main.go +++ b/internal/services/api/main.go @@ -24,6 +24,7 @@ func StartApiService() { engine.GET("/", HandleIp) engine.GET("/json", HandleJson) + engine.GET("/metrics", HandleMetrics) port := os.Getenv(key.EnvApiPort) if len(port) == 0 { diff --git a/internal/services/db_updater/main.go b/internal/services/db_updater/main.go index 69b6fc3..0fce4fd 100644 --- a/internal/services/db_updater/main.go +++ b/internal/services/db_updater/main.go @@ -5,8 +5,11 @@ import ( "github.com/rs/zerolog/log" "thuanle.me/ip-info/configs" "thuanle.me/ip-info/internal/data" + "time" ) +var DbUpdatedAt time.Time + func StartUpdateDbService() { c := cron.New() _, _ = c.AddFunc("@daily", fetchDbs) @@ -29,5 +32,7 @@ func fetchDbs() { log.Err(err).Msg("Failed to reload mmdb") return } + + DbUpdatedAt = time.Now() } }