Skip to content

Commit

Permalink
Skeleton collector with Prometheus endpoint 5/6
Browse files Browse the repository at this point in the history
  • Loading branch information
atimeofday committed Dec 12, 2024
1 parent 44e05f1 commit 24a1e04
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 0 deletions.
21 changes: 21 additions & 0 deletions cmd/collector/collector_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package collector

import (
"fmt"
"strings"
"testing"
"time"

"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/require"
)

// TODO
func TestMetricsUp() {
// testutil.ScrapeAndCompare()
// "http://localhost:2112/metrics"
// # HELP perfpod_memory_collector_up_metric Test metric to confirm skeleton application functionality.
// # TYPE perfpod_memory_collector_up_metric gauge
// perfpod_memory_collector_up_metric 1
}

16 changes: 16 additions & 0 deletions cmd/collector/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module memory-collector

go 1.22.9

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
golang.org/x/sys v0.22.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
)
20 changes: 20 additions & 0 deletions cmd/collector/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
29 changes: 29 additions & 0 deletions cmd/collector/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package main

import (
"net/http"

"github.com/prometheus/client_golang/prometheus"
// "github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

func recordMetrics() {
upMetric := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: "perfpod",
Subsystem: "memory_collector",
Name: "up_metric",
Help: "Test metric to confirm skeleton application functionality.",
})
prometheus.MustRegister(upMetric)

upMetric.Set(1)
}

func main() {
recordMetrics()

http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":2112", nil)
}

91 changes: 91 additions & 0 deletions docs/devlog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
Documentation of development steps, environment, and dependencies

Contributors: atimeofday;
Goals: Create skeleton collector with Prometheus endpoint;
Issues: https://github.com/perfpod/memory-collector/issues/19

Initial environment and tools:
```
# Shell: Bash
distrobox create --image fedora:40 --name memory-collector
distrobox enter memory-collector
sudo dnf install git go
# cd to preferred project directory
# Clone (fork of) project
git clone https://github.com/perfpod/memory-collector
cd memory-collector
```

Issue 19 objective 1: Create a `main.go` file in `cmd/collector`
```
mkdir -p cmd/collector
cd cmd/collector
touch main.go
```

- Prometheus client_golang reference guide: https://prometheus.io/docs/guides/go-application/
- Go package installation reference: https://go.dev/doc/go-get-install-deprecation
- Go Module reference: https://go.dev/ref/mod#go-mod-init
- `go get` and `go install` require a Go Module and/or @version tag as of Go 1.17 in August 2021
- Prometheus go_client installation instructions appear to be outdated and missing a piece
- Submitted issue to Prometheus documentation repository: https://github.com/prometheus/docs/issues/2556#issue-2736636166
- Proceeded with Prometheus client_golang guide
```
cd cmd/collector
go mod init memory-collector
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promauto
go get github.com/prometheus/client_golang/prometheus/promhttp
```

Issue 19 objective 2: Expose an endpoint on a known fixed port
```
# Wrote and tested example Go exposition application from Prometheus guide
go run main.go &
curl http://localhost:2112/metrics
```

Issue 19 objective 3: Expose the `up` metric with value 1
```
# Created, registered, and set an 'up' metric in func main()
upMetric := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: "perfpod",
Subsystem: "memory_collector",
Name: "up_metric",
Help: "Test metric to confirm skeleton application functionality.",
})
prometheus.MustRegister(upMetric)
upMetric.Set(1)
```

Issue 19 objective 4: Manually verify: query the endpoint using `curl` or `wget`
```
curl -s http://localhost:2112/metrics | grep up_metric
```
Output:
```
# HELP perfpod_memory_collector_up_metric Test metric to confirm skeleton application functionality.
# TYPE perfpod_memory_collector_up_metric gauge
perfpod_memory_collector_up_metric 1
```

Issue 19 objective 5: Move the code into a function (not `main()`)
```
# Moved Up metric into "func recordMetrics()" and added function call in main()
func main() {
recordMetrics()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":2112", nil)
}
# Repeated manual verification endpoint query
```

Issue 19 objective 6: Add an integration test that verifies the metrics are up, using client_golang's testutil
- TO DO
- May require assistance

0 comments on commit 24a1e04

Please sign in to comment.