Compare commits

..

5 commits
v3 ... main

Author SHA1 Message Date
b7f4bec668
Fix workflow
All checks were successful
Tests / test (push) Successful in 41s
2025-01-14 09:17:46 +01:00
3922222a12
Fix docs
Some checks are pending
Tests / test (push) Waiting to run
2025-01-14 09:17:03 +01:00
48a7c17448
Fix labels
All checks were successful
Tests / test (push) Successful in 12s
2024-12-22 13:43:31 +01:00
ae6ca5c185
Support for Prometheus SD
All checks were successful
Tests / test (push) Successful in 12s
2024-12-22 13:40:50 +01:00
5dd38b7f18
Prometheus service discovery
All checks were successful
Tests / test (push) Successful in 20s
2024-12-19 21:10:34 +01:00
12 changed files with 255 additions and 3 deletions

View file

@ -12,7 +12,7 @@ on:
jobs: jobs:
test: test:
runs-on: [moon, amd64] runs-on: [dev, amd64]
steps: steps:
- name: Checkout repository - name: Checkout repository

View file

@ -10,7 +10,7 @@ on:
jobs: jobs:
test: test:
runs-on: [moon, amd64] runs-on: [dev, amd64]
steps: steps:
- name: Checkout repository - name: Checkout repository

2
.gitignore vendored
View file

@ -1,3 +1,5 @@
tmp/ tmp/
__debug* __debug*
main main
bin/
nodes.json

2
.vscode/launch.json vendored
View file

@ -29,7 +29,7 @@
"env": { "env": {
"DUMP_PATH": "../tmp/nodes.json", "DUMP_PATH": "../tmp/nodes.json",
"CONFIG_PATH": "../tmp/config.json", "CONFIG_PATH": "../tmp/config.json",
"NODE_DIR_PATH": "../tmp/node" "NODE_PATH": "../tmp/node.json"
}, },
"args": [ "args": [
"node" "node"

View file

@ -20,3 +20,8 @@ tasks:
- go mod tidy - go mod tidy
- mkdir -p bin - mkdir -p bin
- env CGO_ENABLED=0 go build -o bin/lobby2-{{ .VERSION }}-linux-amd64 cli/*.go - env CGO_ENABLED=0 go build -o bin/lobby2-{{ .VERSION }}-linux-amd64 cli/*.go
deploy:
cmds:
- task: build
- scp bin/lobby2-{{ .VERSION }}-linux-amd64 rosti-db:/usr/local/bin/lobby2.tmp
- ssh rosti-db mv /usr/local/bin/lobby2.tmp /usr/local/bin/lobby2

View file

@ -53,6 +53,7 @@ func (a *API) Run() error {
a.e.GET("/nodes", a.listHandler) a.e.GET("/nodes", a.listHandler)
a.e.GET("/nodes/:hostname", a.getHandler) a.e.GET("/nodes/:hostname", a.getHandler)
a.e.POST("/nodes/:hostname", a.refreshHandler) a.e.POST("/nodes/:hostname", a.refreshHandler)
a.e.GET("/prometheus/:service", a.prometheusHandler)
// Start the server in a goroutine so that it doesn't block the signal listening // Start the server in a goroutine so that it doesn't block the signal listening
return a.e.Start(a.listen) return a.e.Start(a.listen)
@ -111,3 +112,19 @@ func (a *API) refreshHandler(c echo.Context) error {
return c.NoContent(http.StatusNoContent) return c.NoContent(http.StatusNoContent)
} }
// @Summary Prometheus service discovery
// @Description Return one nodes based on given hostname
// @Produce application/json
// @Param service path string true "Name of the service like: systemd, pgsql, .."
// @Success 200 {array} []nodes.prometheusDiscovery "Node details"
// @Failure 401 {object} Message "Forbidden access"
// @Security Bearer
// @Router /prometheus/{service} [get]
func (a *API) prometheusHandler(c echo.Context) error {
ss := c.Param("service")
pds := nodes.GetPrometheusSD(a.np, ss)
return c.JSONPretty(http.StatusOK, pds, " ")
}

View file

@ -52,3 +52,23 @@ func printAction(c *cli.Context) error {
return nil return nil
} }
func prometheusAction(c *cli.Context) error {
cfg := GetConfig()
np := nodes.NewNodesProcessor(cfg.DumpPath, cfg.DropAfterSeconds)
pds := nodes.GetPrometheusSD(np, "node")
for _, pd := range pds {
body, err := json.MarshalIndent(pd, "", " ")
if err != nil {
fmt.Printf("failed to marshal prometheus discovery: %v\n", err)
os.Exit(1)
}
fmt.Println(string(body))
}
return nil
}

View file

@ -27,6 +27,11 @@ func main() {
Usage: "Prints all discovered nodes", Usage: "Prints all discovered nodes",
Action: printAction, Action: printAction,
}, },
{
Name: "prometheus",
Usage: "Prints Prometheus Service Discovery",
Action: prometheusAction,
},
}, },
} }

View file

@ -145,6 +145,49 @@ const docTemplate = `{
} }
} }
} }
},
"/prometheus/{service}": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Return one nodes based on given hostname",
"produces": [
"application/json"
],
"summary": "Prometheus service discovery",
"parameters": [
{
"type": "string",
"description": "Name of the service like: systemd, pgsql, ..",
"name": "service",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Node details",
"schema": {
"type": "array",
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/nodes.prometheusDiscovery"
}
}
}
},
"401": {
"description": "Forbidden access",
"schema": {
"$ref": "#/definitions/api.Message"
}
}
}
}
} }
}, },
"definitions": { "definitions": {
@ -181,6 +224,23 @@ const docTemplate = `{
"type": "integer" "type": "integer"
} }
} }
},
"nodes.prometheusDiscovery": {
"type": "object",
"properties": {
"Labels": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"Targets": {
"type": "array",
"items": {
"type": "string"
}
}
}
} }
}, },
"securityDefinitions": { "securityDefinitions": {

View file

@ -137,6 +137,49 @@
} }
} }
} }
},
"/prometheus/{service}": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Return one nodes based on given hostname",
"produces": [
"application/json"
],
"summary": "Prometheus service discovery",
"parameters": [
{
"type": "string",
"description": "Name of the service like: systemd, pgsql, ..",
"name": "service",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Node details",
"schema": {
"type": "array",
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/nodes.prometheusDiscovery"
}
}
}
},
"401": {
"description": "Forbidden access",
"schema": {
"$ref": "#/definitions/api.Message"
}
}
}
}
} }
}, },
"definitions": { "definitions": {
@ -173,6 +216,23 @@
"type": "integer" "type": "integer"
} }
} }
},
"nodes.prometheusDiscovery": {
"type": "object",
"properties": {
"Labels": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"Targets": {
"type": "array",
"items": {
"type": "string"
}
}
}
} }
}, },
"securityDefinitions": { "securityDefinitions": {

View file

@ -22,6 +22,17 @@ definitions:
last_update: last_update:
type: integer type: integer
type: object type: object
nodes.prometheusDiscovery:
properties:
Labels:
additionalProperties:
type: string
type: object
Targets:
items:
type: string
type: array
type: object
info: info:
contact: {} contact: {}
description: API of Lobby 2 project that helps to discover and connect to other description: API of Lobby 2 project that helps to discover and connect to other
@ -111,6 +122,33 @@ paths:
security: security:
- Bearer: [] - Bearer: []
summary: Refresh node summary: Refresh node
/prometheus/{service}:
get:
description: Return one nodes based on given hostname
parameters:
- description: 'Name of the service like: systemd, pgsql, ..'
in: path
name: service
required: true
type: string
produces:
- application/json
responses:
"200":
description: Node details
schema:
items:
items:
$ref: '#/definitions/nodes.prometheusDiscovery'
type: array
type: array
"401":
description: Forbidden access
schema:
$ref: '#/definitions/api.Message'
security:
- Bearer: []
summary: Prometheus service discovery
securityDefinitions: securityDefinitions:
Bearer: Bearer:
in: header in: header

45
nodes/prometheus.go Normal file
View file

@ -0,0 +1,45 @@
package nodes
import (
"fmt"
"strings"
)
type prometheusDiscovery struct {
Labels map[string]string `json:"Labels"`
Targets []string `json:"Targets"`
}
func GetPrometheusSD(p *NodesProcessor, ss string) []prometheusDiscovery {
ns := p.List()
pds := []prometheusDiscovery{
{
Labels: make(map[string]string),
Targets: []string{},
},
}
for _, node := range ns {
port, ok := node.KV["prometheus_port"]
if !ok {
port = "9999"
}
host, ok := node.KV["prometheus_host"]
if !ok {
host = node.HostName
}
v, ok := node.KV["prometheus_exporters"]
if ok {
services := strings.Split(v, ",")
for _, service := range services {
if ss == service {
pds[0].Targets = append(pds[0].Targets, fmt.Sprintf("%s:%s", host, port))
}
}
}
}
return pds
}