Compare commits
11 commits
6fb59dd7be
...
0c832c4dec
Author | SHA1 | Date | |
---|---|---|---|
|
0c832c4dec | ||
|
e176ed4db9 | ||
|
560a8c093c | ||
|
bd5c47c7fc | ||
|
c59a3d23d6 | ||
|
d6a4b3cc6c | ||
|
907ba3a708 | ||
|
7e3d56c3e0 | ||
|
b52e18aca1 | ||
|
00a1ed912b | ||
|
0ea6cd556c |
14 changed files with 162 additions and 152 deletions
7
.github/workflows/build.yml
vendored
7
.github/workflows/build.yml
vendored
|
@ -2,11 +2,10 @@ name: Build
|
|||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
branches: ["main"]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
branches: ["main"]
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: Run build
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -14,4 +13,4 @@ jobs:
|
|||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
- name: Build
|
||||
run: go build -o ./immich.out ./src
|
||||
run: make build
|
||||
|
|
27
.github/workflows/codeql-analysis.yml
vendored
27
.github/workflows/codeql-analysis.yml
vendored
|
@ -3,9 +3,9 @@ name: CodeQL
|
|||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
branches: ["main"]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
branches: ["main"]
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
|
@ -19,16 +19,21 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'go' ]
|
||||
language: ["go"]
|
||||
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
|
||||
- name: CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
|
|
27
.github/workflows/docker.yml
vendored
27
.github/workflows/docker.yml
vendored
|
@ -1,4 +1,4 @@
|
|||
name: Publish Release
|
||||
name: Docker Build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
@ -16,7 +16,7 @@ on:
|
|||
branches: ["main"]
|
||||
|
||||
jobs:
|
||||
build_docker_release:
|
||||
build_and_push:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
@ -25,16 +25,6 @@ jobs:
|
|||
ref: "main"
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Release tag
|
||||
id: releasetag
|
||||
run: |
|
||||
if [ -z "${{ inputs.tag }}" ]; then
|
||||
latest_release_tag=$(curl -s "https://api.github.com/repos/${{ github.repository_owner }}/${{ github.event.repository.name }}/releases/latest" | jq -r .tag_name)
|
||||
echo "release_tag=${latest_release_tag}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "release_tag=${{ inputs.tag }}" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
|
@ -42,9 +32,11 @@ jobs:
|
|||
images: |
|
||||
ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}
|
||||
tags: |
|
||||
type=raw,value=latest,enable=true
|
||||
type=sha
|
||||
type=raw,value=${{ steps.releasetag.outputs.release_tag }},enable=true
|
||||
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=ref,event=tag
|
||||
type=raw,value=${{ inputs.tags }},enable=${{ github.event_name == 'workflow_dispatch' }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
@ -58,7 +50,6 @@ jobs:
|
|||
with:
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
|
@ -66,13 +57,13 @@ jobs:
|
|||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_TOKEN }}
|
||||
if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./
|
||||
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||
push: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
|
||||
push: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: BUILD_VERSION=${{ github.event.release.name }}
|
||||
|
|
14
.github/workflows/test.yml
vendored
14
.github/workflows/test.yml
vendored
|
@ -1,4 +1,4 @@
|
|||
name: Test
|
||||
name: Tests
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
|
@ -13,7 +13,15 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Run unit tests
|
||||
run: go test -v ./src/tests
|
||||
run: make test
|
||||
|
||||
- name: Run formatter
|
||||
run: test -z $(gofmt -l ./src)
|
||||
run: cd src && test -z $(gofmt -l .)
|
||||
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@v3
|
||||
with:
|
||||
version: v1.55.2
|
||||
working-directory: src
|
||||
|
|
17
Dockerfile
17
Dockerfile
|
@ -1,16 +1,21 @@
|
|||
FROM golang:1.21-alpine3.18 AS builder
|
||||
FROM golang:1.21-alpine3.19 AS builder
|
||||
|
||||
ARG BUILD_VERSION
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
COPY src src
|
||||
|
||||
RUN go build -o /go/bin/immich-exporter ./src
|
||||
RUN cd src && \
|
||||
if [ -n "${BUILD_VERSION}" ]; then \
|
||||
go build -o /go/bin/immich-exporter -ldflags="-X 'main.Version=${BUILD_VERSION}'" . ; \
|
||||
else \
|
||||
go build -o /go/bin/immich-exporter . ; \
|
||||
fi
|
||||
|
||||
|
||||
FROM alpine:3.18
|
||||
FROM alpine:3.19
|
||||
|
||||
COPY --from=builder /go/bin/immich-exporter /go/bin/immich-exporter
|
||||
COPY package.json /go/bin/
|
||||
|
||||
WORKDIR /go/bin
|
||||
|
||||
|
|
20
Makefile
Normal file
20
Makefile
Normal file
|
@ -0,0 +1,20 @@
|
|||
build:
|
||||
cd src && go build -o ../immich-exporter.out .
|
||||
|
||||
dev :
|
||||
cd src && go run .
|
||||
|
||||
dev-env :
|
||||
cd src && go run . -e
|
||||
|
||||
format :
|
||||
cd src && test -z $(gofmt -l .)
|
||||
|
||||
lint:
|
||||
docker run --rm -v ./src:/app -w /app golangci/golangci-lint:latest golangci-lint run -v
|
||||
|
||||
test:
|
||||
cd src && go test -v ./tests
|
||||
|
||||
update:
|
||||
cd src && go get -u . && go mod tidy
|
|
@ -22,7 +22,7 @@ docker run --name=immich-exporter \
|
|||
-e IMMICH_BASE_URL=http://192.168.1.10:8080 \
|
||||
-e IMMICH_API_KEY=<your_api_key> \
|
||||
-p 8090:8090 \
|
||||
martabal/immich-exporter
|
||||
ghcr.io/martabal/immich-exporter
|
||||
```
|
||||
|
||||
### Docker-compose
|
||||
|
@ -31,7 +31,7 @@ docker run --name=immich-exporter \
|
|||
version: "2.1"
|
||||
services:
|
||||
immich:
|
||||
image: martabal/immich-exporter:latest
|
||||
image: ghcr.io/martabal/immich-exporter:latest
|
||||
container_name: immich-exporter
|
||||
environment:
|
||||
- IMMICH_BASE_URL=http://192.168.1.10:8080
|
||||
|
|
24
package.json
24
package.json
|
@ -1,24 +0,0 @@
|
|||
{
|
||||
"name": "immich-exporter",
|
||||
"version": "1.2.0",
|
||||
"description": "exporter for immich",
|
||||
"main": "src/main.go",
|
||||
"scripts": {
|
||||
"build" : "go build -o ./immich-exporter.out ./src && ./immich-exporter.out",
|
||||
"build:env" : "go build -o ./immich-exporter.out ./src && ./immich-exporter.out -e",
|
||||
"dev" : "go run ./src",
|
||||
"dev:env" : "go run ./src -e",
|
||||
"test": "go test -v ./src/tests",
|
||||
"update": "go get -u ./src && go mod tidy"
|
||||
},
|
||||
"keywords": [
|
||||
"exporter",
|
||||
"immich",
|
||||
"grafana",
|
||||
"dashboard",
|
||||
"metrics",
|
||||
"prometheus"
|
||||
],
|
||||
"author": "martabal",
|
||||
"license": "MIT"
|
||||
}
|
|
@ -4,17 +4,16 @@ go 1.21
|
|||
|
||||
require (
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/prometheus/client_golang v1.17.0
|
||||
github.com/prometheus/client_golang v1.18.0
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
|
||||
github.com/prometheus/client_model v0.5.0 // indirect
|
||||
github.com/prometheus/common v0.45.0 // indirect
|
||||
github.com/prometheus/common v0.46.0 // indirect
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
golang.org/x/sys v0.14.0 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
golang.org/x/sys v0.16.0 // indirect
|
||||
google.golang.org/protobuf v1.32.0 // indirect
|
||||
)
|
|
@ -5,22 +5,18 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
|
|||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
|
||||
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
|
||||
github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
|
||||
github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
|
||||
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
|
||||
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
|
||||
github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
|
||||
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
|
||||
github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y=
|
||||
github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ=
|
||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
|
@ -29,12 +25,10 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
|||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
|
||||
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
@ -3,13 +3,13 @@ package immich
|
|||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"immich-exp/src/models"
|
||||
"io/ioutil"
|
||||
"immich-exp/models"
|
||||
"io"
|
||||
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
prom "immich-exp/src/prometheus"
|
||||
prom "immich-exp/prometheus"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
|
@ -18,6 +18,32 @@ import (
|
|||
|
||||
var wg sync.WaitGroup
|
||||
|
||||
var (
|
||||
mutex sync.Mutex
|
||||
)
|
||||
|
||||
type Data struct {
|
||||
URL string
|
||||
HTTPMethod string
|
||||
}
|
||||
|
||||
var httpGetUsers = Data{
|
||||
URL: "/api/user?isAll=true",
|
||||
HTTPMethod: http.MethodGet,
|
||||
}
|
||||
var httpServerVersion = Data{
|
||||
URL: "/api/server-info/version",
|
||||
HTTPMethod: http.MethodGet,
|
||||
}
|
||||
var httpStatistics = Data{
|
||||
URL: "/api/server-info/statistics",
|
||||
HTTPMethod: http.MethodGet,
|
||||
}
|
||||
var httpGetJobs = Data{
|
||||
URL: "/api/jobs",
|
||||
HTTPMethod: http.MethodGet,
|
||||
}
|
||||
|
||||
var unmarshalError = "Can not unmarshal JSON"
|
||||
|
||||
func Allrequests(r *prometheus.Registry) {
|
||||
|
@ -52,48 +78,45 @@ func Analyze(r *prometheus.Registry) {
|
|||
|
||||
res3, err3 := (<-serverinfo)()
|
||||
|
||||
if err != nil && err2 != nil && err3 != nil {
|
||||
} else {
|
||||
if err == nil && err2 == nil && err3 == nil {
|
||||
prom.SendBackMessagePreference(res3, res2, res1, r)
|
||||
}
|
||||
}
|
||||
|
||||
func GetAllUsers(c chan func() (*models.StructAllUsers, error)) {
|
||||
defer wg.Done()
|
||||
resp, err := Apirequest("/api/user?isAll=true", "GET")
|
||||
resp, err := Apirequest(httpGetUsers.URL, httpGetUsers.HTTPMethod)
|
||||
if err == nil {
|
||||
if models.GetPromptError() == true {
|
||||
models.SetPromptError(false)
|
||||
}
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
} else {
|
||||
|
||||
result := new(models.StructAllUsers)
|
||||
if err := json.Unmarshal(body, &result); err != nil { // Parse []byte to go struct pointer
|
||||
if err := json.Unmarshal(body, &result); err != nil {
|
||||
log.Error(unmarshalError)
|
||||
}
|
||||
|
||||
c <- (func() (*models.StructAllUsers, error) { return result, nil })
|
||||
return
|
||||
}
|
||||
}
|
||||
c <- (func() (*models.StructAllUsers, error) { return new(models.StructAllUsers), err })
|
||||
}
|
||||
|
||||
func ServerVersion(r *prometheus.Registry) {
|
||||
defer wg.Done()
|
||||
resp, err := Apirequest("/api/server-info/version", "GET")
|
||||
resp, err := Apirequest(httpServerVersion.URL, httpServerVersion.HTTPMethod)
|
||||
if err == nil {
|
||||
if models.GetPromptError() == true {
|
||||
models.SetPromptError(false)
|
||||
}
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
} else {
|
||||
|
||||
var result models.StructServerVersion
|
||||
if err := json.Unmarshal(body, &result); err != nil { // Parse []byte to go struct pointer
|
||||
if err := json.Unmarshal(body, &result); err != nil {
|
||||
log.Error(unmarshalError)
|
||||
}
|
||||
|
||||
|
@ -104,48 +127,44 @@ func ServerVersion(r *prometheus.Registry) {
|
|||
|
||||
func ServerInfo(c chan func() (*models.StructServerInfo, error)) {
|
||||
defer wg.Done()
|
||||
resp, err := Apirequest("/api/server-info/statistics", "GET")
|
||||
resp, err := Apirequest(httpStatistics.URL, httpStatistics.HTTPMethod)
|
||||
if err == nil {
|
||||
|
||||
if models.GetPromptError() == true {
|
||||
models.SetPromptError(false)
|
||||
}
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
} else {
|
||||
|
||||
result := new(models.StructServerInfo)
|
||||
if err := json.Unmarshal(body, &result); err != nil { // Parse []byte to go struct pointer
|
||||
if err := json.Unmarshal(body, &result); err != nil {
|
||||
log.Println(unmarshalError)
|
||||
}
|
||||
c <- (func() (*models.StructServerInfo, error) { return result, nil })
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
c <- (func() (*models.StructServerInfo, error) { return new(models.StructServerInfo), err })
|
||||
}
|
||||
|
||||
func GetAllJobsStatus(c chan func() (*models.StructAllJobsStatus, error)) {
|
||||
defer wg.Done()
|
||||
resp, err := Apirequest("/api/jobs", "GET")
|
||||
resp, err := Apirequest(httpGetJobs.URL, httpGetJobs.HTTPMethod)
|
||||
if err == nil {
|
||||
|
||||
if models.GetPromptError() == true {
|
||||
models.SetPromptError(false)
|
||||
}
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
} else {
|
||||
|
||||
result := new(models.StructAllJobsStatus)
|
||||
if err := json.Unmarshal(body, &result); err != nil { // Parse []byte to go struct pointer
|
||||
if err := json.Unmarshal(body, &result); err != nil {
|
||||
log.Println(unmarshalError)
|
||||
}
|
||||
c <- (func() (*models.StructAllJobsStatus, error) { return result, nil })
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
c <- (func() (*models.StructAllJobsStatus, error) { return new(models.StructAllJobsStatus), err })
|
||||
}
|
||||
|
||||
func Apirequest(uri string, method string) (*http.Response, error) {
|
||||
|
@ -160,38 +179,41 @@ func Apirequest(uri string, method string) (*http.Response, error) {
|
|||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
err := fmt.Errorf("Can't connect to server")
|
||||
if models.GetPromptError() == false {
|
||||
mutex.Lock()
|
||||
if !models.GetPromptError() {
|
||||
log.Error(err.Error())
|
||||
models.SetPromptError(true)
|
||||
}
|
||||
|
||||
mutex.Unlock()
|
||||
return resp, err
|
||||
|
||||
}
|
||||
switch resp.StatusCode {
|
||||
case http.StatusOK:
|
||||
mutex.Lock()
|
||||
if models.GetPromptError() {
|
||||
models.SetPromptError(false)
|
||||
}
|
||||
mutex.Unlock()
|
||||
return resp, nil
|
||||
case http.StatusNotFound:
|
||||
err := fmt.Errorf("%d", resp.StatusCode)
|
||||
|
||||
log.Fatal("Error code ", resp.StatusCode, " for ", models.Getbaseurl()+uri)
|
||||
|
||||
return resp, err
|
||||
return resp, fmt.Errorf("%d", resp.StatusCode)
|
||||
case http.StatusUnauthorized, http.StatusForbidden:
|
||||
err := fmt.Errorf("%d", resp.StatusCode)
|
||||
|
||||
log.Fatal("Api key unauthorized")
|
||||
|
||||
return resp, err
|
||||
return resp, fmt.Errorf("%d", resp.StatusCode)
|
||||
default:
|
||||
err := fmt.Errorf("%d", resp.StatusCode)
|
||||
mutex.Lock()
|
||||
if !models.GetPromptError() {
|
||||
models.SetPromptError(true)
|
||||
log.Debug("Error code ", resp.StatusCode)
|
||||
}
|
||||
mutex.Unlock()
|
||||
return resp, err
|
||||
}
|
||||
|
||||
|
|
39
src/init.go
39
src/init.go
|
@ -1,11 +1,10 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
immich "immich-exp/src/immich"
|
||||
"immich-exp/src/models"
|
||||
immich "immich-exp/immich"
|
||||
"immich-exp/models"
|
||||
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
@ -21,15 +20,26 @@ import (
|
|||
|
||||
const DEFAULTPORT = 8090
|
||||
|
||||
var (
|
||||
Version = "dev"
|
||||
Author = "martabal"
|
||||
ProjectName = "immich-exporter"
|
||||
)
|
||||
|
||||
func main() {
|
||||
loadenv()
|
||||
projectinfo()
|
||||
fmt.Printf("%s (version %s)\n", ProjectName, Version)
|
||||
fmt.Println("Author: ", Author)
|
||||
fmt.Println("Using log level: ", log.GetLevel())
|
||||
log.Info("Immich URL: ", models.Getbaseurl())
|
||||
log.Info("Started")
|
||||
http.HandleFunc("/metrics", metrics)
|
||||
addr := ":" + strconv.Itoa(models.GetPort())
|
||||
log.Info("Listening on port ", models.GetPort())
|
||||
http.ListenAndServe(addr, nil)
|
||||
err := http.ListenAndServe(addr, nil)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
}
|
||||
|
||||
func metrics(w http.ResponseWriter, r *http.Request) {
|
||||
|
@ -40,25 +50,6 @@ func metrics(w http.ResponseWriter, r *http.Request) {
|
|||
h.ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
func projectinfo() {
|
||||
fileContent, err := os.ReadFile("./package.json")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
|
||||
var res map[string]interface{}
|
||||
err = json.Unmarshal(fileContent, &res)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Print(res["name"], " (version ", res["version"], ")\n")
|
||||
fmt.Print("Author: ", res["author"], "\n")
|
||||
fmt.Print("Using log level: ", log.GetLevel(), "\n")
|
||||
}
|
||||
|
||||
func loadenv() {
|
||||
var envfile bool
|
||||
flag.BoolVar(&envfile, "e", false, "Use .env file")
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package prom
|
||||
|
||||
import (
|
||||
"immich-exp/src/models"
|
||||
"immich-exp/models"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
package prom
|
||||
|
||||
import (
|
||||
"immich-exp/src/models"
|
||||
prom "immich-exp/src/prometheus"
|
||||
"immich-exp/models"
|
||||
prom "immich-exp/prometheus"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue