50 Commits

Author SHA1 Message Date
renovate[bot]
0bd217aec1 Update module github.com/prometheus/client_golang to v1.20.5 2024-10-15 11:47:48 +00:00
088ec1ea4f Merge pull request #22 from nikdoof/renovate/alpine-3.x
Update alpine Docker tag to v3.17.2
2023-03-23 21:47:05 +00:00
4f7966271d Merge pull request #20 from nikdoof/renovate/github.com-prometheus-client_golang-1.x
Update module github.com/prometheus/client_golang to v1.14.0
2023-03-23 21:46:41 +00:00
edfceeed7b Merge pull request #18 from nikdoof/renovate/wangyoucao577-go-release-action-1.x
Update wangyoucao577/go-release-action action to v1.36
2023-03-23 21:46:28 +00:00
d72a9c99a4 Merge pull request #23 from nikdoof/renovate/docker-build-push-action-4.x
Update docker/build-push-action action to v4
2023-03-23 21:46:05 +00:00
renovate[bot]
27b403fa48 Update wangyoucao577/go-release-action action to v1.36 2023-03-02 07:54:59 +00:00
renovate[bot]
4a03c07093 Update docker/build-push-action action to v4 2023-02-28 15:01:13 +00:00
renovate[bot]
b61f6a14af Update alpine Docker tag to v3.17.2 2023-02-28 11:55:28 +00:00
50b7701c77 Merge pull request #16 from nikdoof/renovate/alpine-3.x
Update alpine Docker tag to v3.16.3
2023-02-28 11:55:09 +00:00
renovate[bot]
fa9919c88b Update module github.com/prometheus/client_golang to v1.14.0 2022-11-20 17:29:54 +00:00
renovate[bot]
8a35e17233 Update alpine Docker tag to v3.16.3 2022-11-20 17:29:33 +00:00
10ac1d13b9 Build for multiplatform 2022-07-16 12:20:50 +01:00
c80f4dcc66 Merge pull request #14 from nikdoof/renovate/alpine-3.x
Update dependency alpine to v3.16.0
2022-07-16 12:15:58 +01:00
48fea3fe80 Merge pull request #11 from nikdoof/renovate/golang-1.x
Update dependency golang to v1.18.4
2022-07-16 12:15:43 +01:00
d71bcc4d56 Merge pull request #12 from nikdoof/renovate/github.com-prometheus-client_golang-1.x
Update module github.com/prometheus/client_golang to v1.12.2
2022-07-16 12:15:17 +01:00
renovate[bot]
b37adf0b61 Update module github.com/prometheus/client_golang to v1.12.2 2022-07-16 11:15:05 +00:00
40643079b6 Merge pull request #7 from nikdoof/renovate/docker-build-push-action-3.x
Update docker/build-push-action action to v3
2022-07-16 12:14:57 +01:00
bbfc3b67b8 Merge pull request #8 from nikdoof/renovate/docker-login-action-2.x
Update docker/login-action action to v2
2022-07-16 12:14:51 +01:00
6f3887a3e2 Merge pull request #9 from nikdoof/renovate/docker-setup-buildx-action-2.x
Update docker/setup-buildx-action action to v2
2022-07-16 12:14:44 +01:00
7552505b99 Merge pull request #10 from nikdoof/renovate/docker-setup-qemu-action-2.x
Update docker/setup-qemu-action action to v2
2022-07-16 12:14:37 +01:00
ecbf98700d Merge pull request #13 from nikdoof/renovate/wangyoucao577-go-release-action-1.x
Update wangyoucao577/go-release-action action to v1.29
2022-07-16 12:14:26 +01:00
renovate[bot]
e90a87a435 Update dependency golang to v1.18.4 2022-07-16 11:14:02 +00:00
f85eafdf16 Merge pull request #15 from nikdoof/renovate/github.com-rs-zerolog-1.x
Update module github.com/rs/zerolog to v1.27.0
2022-07-16 12:13:46 +01:00
renovate[bot]
9b914f9f12 Update wangyoucao577/go-release-action action to v1.29 2022-06-24 12:13:21 +00:00
Renovate Bot
9a37b06aeb Update module github.com/rs/zerolog to v1.27.0 2022-06-07 21:37:09 +00:00
Renovate Bot
ee938d3759 Update dependency alpine to v3.16.0 2022-06-06 00:11:15 +00:00
Renovate Bot
4cefdcd89e Update docker/setup-qemu-action action to v2 2022-05-05 20:37:40 +00:00
Renovate Bot
f682e87555 Update docker/setup-buildx-action action to v2 2022-05-05 20:37:37 +00:00
Renovate Bot
22f41f8273 Update docker/login-action action to v2 2022-05-05 17:17:09 +00:00
Renovate Bot
c8821a2a9c Update docker/build-push-action action to v3 2022-05-05 17:17:06 +00:00
b72ae30261 Merge pull request #4 from nikdoof/renovate/wangyoucao577-go-release-action-1.x
Update wangyoucao577/go-release-action action to v1.26
2022-05-05 13:53:17 +01:00
Renovate Bot
a5375b97f8 Update wangyoucao577/go-release-action action to v1.26 2022-05-05 12:52:23 +00:00
e845933b6d Merge pull request #5 from nikdoof/renovate/actions-checkout-3.x
Update actions/checkout action to v3
2022-05-05 13:52:11 +01:00
d0a6fa700d Merge pull request #6 from nikdoof/renovate/alpine-3.x
Update dependency alpine to v3.15.4
2022-05-05 13:52:01 +01:00
914c166a82 Update Golang release version 2022-05-05 13:51:44 +01:00
31dced7273 Merge pull request #3 from nikdoof/renovate/golang-1.x
Update dependency golang to v1.18.1
2022-05-05 13:51:20 +01:00
d499adcb00 Merge pull request #1 from nikdoof/renovate/github.com-prometheus-client_golang-1.x
Update module github.com/prometheus/client_golang to v1.12.1
2022-05-05 13:51:03 +01:00
Renovate Bot
e03bec5d12 Update module github.com/prometheus/client_golang to v1.12.1 2022-05-05 12:50:52 +00:00
9e0072de26 Merge pull request #2 from nikdoof/renovate/github.com-rs-zerolog-1.x
Update module github.com/rs/zerolog to v1.26.1
2022-05-05 13:49:44 +01:00
Renovate Bot
cb243b79f4 Update dependency golang to v1.18.1 2022-04-24 22:19:03 +00:00
Renovate Bot
1c43fa9dc1 Update dependency alpine to v3.15.4 2022-04-24 22:18:58 +00:00
Renovate Bot
2cf5b631d9 Update actions/checkout action to v3 2022-03-07 14:00:25 +00:00
Renovate Bot
12dc22f33a Update module github.com/rs/zerolog to v1.26.1 2021-12-16 00:48:30 +00:00
a7b272e5da Fix dockerfile 2021-12-06 17:36:12 +00:00
7174c924b5 Add build infra 2021-12-06 17:33:53 +00:00
Andrew Rowson
cee9a58e4c Added dockerfile 2021-04-17 14:54:07 +01:00
James O'Gorman
89bacd6ee3 Set User-Agent header
It's nice to third parties if you set User-Agent so the caller can be
identified. By default Go will set a User-Agent header to a string like
"Go-http-client/1.1".

The library now sets it to a string that identifies the source of the
program (github.com/jamesog/aaisp-chaos) and the compiled Go OS, arch
and version, to aid any potential debugging:

    chaos-go (darwin; amd64; go1.15.5) github.com/jamesog/aaisp-chaos
2020-11-28 15:56:16 +00:00
James O'Gorman
16d476249d Improve flag usage, check for required env vars
Switch to a custom FlagSet and add a nicer usage message.

Check for the required CHAOS_CONTROL_LOGIN and CHAOS_CONTROL_PASSWORD
environment variables and exit with an error if neither is set. The
usage string also mentions that both must be set.
2020-11-28 15:53:47 +00:00
James O'Gorman
cab8f1f626 Add a standard logger and HTTP logging middleware
Create a standard log object and use dependency injection to pass it to
the broadbandCollector and a new loggingMiddleware for wrapping HTTP
requests to log the request.

Logs are emitted as structured JSON logs by default but can be switched
to a human-friendly output by passing -log.level console.

The Prometheus client_golang library has also been upgraded.
2020-11-28 15:06:05 +00:00
James O'Gorman
b8f807c01f Add aaisp_scrape_success gauge
Previously if we fail to connect to CHAOS during a scrape no metrics are
emitted.

Now a aaisp_scrape_success metric is always emitted with values 0 for
failure and 1 for success, along the lines of blackbox_exporter's
probe_success metric.
2020-11-28 14:20:58 +00:00
9 changed files with 2124 additions and 17 deletions

5
.github/renovate.json vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"extends": [
"config:base"
]
}

View File

@@ -0,0 +1,33 @@
name: ci
on:
push:
branches:
- "master"
tags:
- "[0-9]+.[0-9]+.[0-9]+"
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to GHCR
uses: docker/login-action@v2
if: github.event_name != 'pull_request'
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v4
with:
push: true
platforms: linux/amd64,linux/arm64,linux/arm/v7
tags: |
ghcr.io/${{ github.repository_owner }}/aaisp-exporter:${{ github.ref_name }}
ghcr.io/${{ github.repository_owner }}/aaisp-exporter:latest

28
.github/workflows/release.yaml vendored Normal file
View File

@@ -0,0 +1,28 @@
on:
release:
types: [created]
jobs:
releases-matrix:
name: Release Go Binary
runs-on: ubuntu-latest
strategy:
matrix:
goos: [linux, windows, darwin]
goarch: ["386", amd64, arm64]
exclude:
- goarch: "386"
goos: darwin
- goarch: arm64
goos: windows
steps:
- uses: actions/checkout@v3
- uses: wangyoucao577/go-release-action@v1.36
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
goos: ${{ matrix.goos }}
goarch: ${{ matrix.goarch }}
goversion: "https://dl.google.com/go/go1.18.4.linux-amd64.tar.gz"
project_path: "./cmd/aaisp_exporter"
binary_name: "aaisp_exporter"
extra_files: LICENSE cmd/aaisp_exporter/README.md

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
aaisp_exporter

10
Dockerfile Normal file
View File

@@ -0,0 +1,10 @@
FROM golang:1.18.4-alpine3.16 as build
WORKDIR /build
COPY . .
RUN go get -d -v .
RUN go build -v ./cmd/aaisp_exporter
FROM alpine:3.17.2
WORKDIR /service
COPY --from=build /build/aaisp_exporter .
ENTRYPOINT ["./aaisp_exporter"]

View File

@@ -8,6 +8,7 @@ import (
"io/ioutil"
"net/http"
"net/url"
"runtime"
"strings"
"time"
)
@@ -55,6 +56,14 @@ func (a Auth) form() url.Values {
return f
}
func userAgent() string {
return fmt.Sprintf("chaos-go (%s; %s; %s) github.com/jamesog/aaisp-chaos",
runtime.GOOS,
runtime.GOARCH,
runtime.Version(),
)
}
func (api API) makeRequest(url string) ([]byte, error) {
client := &http.Client{
Timeout: 10 * time.Second,
@@ -64,6 +73,7 @@ func (api API) makeRequest(url string) ([]byte, error) {
if err != nil {
return nil, err
}
req.Header.Set("User-Agent", userAgent())
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)
if err != nil {

View File

@@ -2,7 +2,8 @@ package main
import (
"flag"
"log"
"fmt"
"net"
"net/http"
"os"
"strconv"
@@ -10,6 +11,7 @@ import (
chaos "github.com/jamesog/aaisp-chaos"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/rs/zerolog"
)
var (
@@ -37,10 +39,15 @@ var (
[]string{"line_id"},
nil,
)
scrapeSuccessGauge = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "aaisp_scrape_success",
Help: "Displays whether or not the AAISP API scrape was a success",
})
)
type broadbandCollector struct {
*chaos.API
log zerolog.Logger
}
func (bc broadbandCollector) Describe(ch chan<- *prometheus.Desc) {
@@ -50,9 +57,11 @@ func (bc broadbandCollector) Describe(ch chan<- *prometheus.Desc) {
func (bc broadbandCollector) Collect(ch chan<- prometheus.Metric) {
lines, err := bc.BroadbandInfo()
if err != nil {
log.Printf("error getting broadband info: %v\n", err)
bc.log.Debug().Err(err).Msg("error getting broadband info")
scrapeSuccessGauge.Set(0)
return
}
scrapeSuccessGauge.Set(1)
for _, line := range lines {
ch <- prometheus.MustNewConstMetric(
broadbandQuotaRemainingDesc,
@@ -81,18 +90,98 @@ func (bc broadbandCollector) Collect(ch chan<- prometheus.Metric) {
}
}
func loggingMiddleware(log zerolog.Logger) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
remoteHost, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
remoteHost = r.RemoteAddr
}
log.Log().
Str("proto", r.Proto).
Str("method", r.Method).
Str("path", r.URL.Path).
Str("remote_addr", remoteHost).
Str("user_agent", r.Header.Get("User-Agent")).
Send()
next.ServeHTTP(w, r)
}
return http.HandlerFunc(fn)
}
}
func usage(fs *flag.FlagSet) func() {
return func() {
o := fs.Output()
fmt.Fprintf(o, "Usage:\n %s ", os.Args[0])
fs.VisitAll(func(f *flag.Flag) {
s := fmt.Sprintf(" [-%s", f.Name)
if arg, _ := flag.UnquoteUsage(f); len(arg) > 0 {
s += " " + arg
}
s += "]"
fmt.Fprint(o, s)
})
fmt.Fprint(o, "\n\nOptions:\n")
fs.PrintDefaults()
fmt.Fprint(o, "\nThe environment variables CHAOS_CONTROL_LOGIN and CHAOS_CONTROL_PASSWORD must be set.\n")
}
}
func setupLogger(level, output string) zerolog.Logger {
ll, err := zerolog.ParseLevel(level)
if err != nil {
ll = zerolog.InfoLevel
}
log := zerolog.New(os.Stderr).Level(ll).With().Timestamp().Logger()
switch output {
case "console":
log = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}
return log
}
func main() {
listen := flag.String("listen", ":8080", "listen `address`")
flag.Parse()
fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
fs.Usage = usage(fs)
var (
listen = fs.String("listen", ":8080", "listen `address`")
logLevel = fs.String("log.level", "info", "log `level`")
logOutput = fs.String("log.output", "json", "log output `style` (json, console)")
)
fs.Parse(os.Args[1:])
log := setupLogger(*logLevel, *logOutput)
var (
controlLogin = os.Getenv("CHAOS_CONTROL_LOGIN")
controlPassword = os.Getenv("CHAOS_CONTROL_PASSWORD")
)
switch {
case controlLogin == "" && controlPassword == "":
log.Fatal().Msg("CHAOS_CONTROL_LOGIN and CHAOS_CONTROL_PASSWORD must be set in the environment")
case controlLogin == "":
log.Fatal().Msg("CHAOS_CONTROL_LOGIN is not set")
case controlPassword == "":
log.Fatal().Msg("CHAOS_CONTROL_PASSWORD is not set")
}
collector := broadbandCollector{
API: chaos.New(chaos.Auth{
ControlLogin: os.Getenv("CHAOS_CONTROL_LOGIN"),
ControlPassword: os.Getenv("CHAOS_CONTROL_PASSWORD"),
ControlLogin: controlLogin,
ControlPassword: controlPassword,
}),
log: log,
}
loggedHandler := loggingMiddleware(log)
prometheus.MustRegister(collector)
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(*listen, nil))
prometheus.MustRegister(scrapeSuccessGauge)
http.Handle("/metrics", loggedHandler(promhttp.Handler()))
log.Info().Msgf("Listening on %s", *listen)
log.Fatal().Err(http.ListenAndServe(*listen, nil)).Send()
}

5
go.mod
View File

@@ -2,4 +2,7 @@ module github.com/jamesog/aaisp-chaos
go 1.13
require github.com/prometheus/client_golang v1.1.0
require (
github.com/prometheus/client_golang v1.20.5
github.com/rs/zerolog v1.27.0
)

1944
go.sum

File diff suppressed because it is too large Load Diff