Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
alexopryshko committed Aug 28, 2021
2 parents dd1dd6f + 221dcc2 commit 6e90292
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 29 deletions.
17 changes: 8 additions & 9 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
FROM golang:1.16-alpine as builder

WORKDIR $GOPATH/src/kts/push
WORKDIR $GOPATH/src/github.com/ktsstudio/selectel-exporter
COPY . .
RUN ls -al .
RUN go build pkg/main.go
RUN cp main /
RUN apk update && apk upgrade && apk add --no-cache ca-certificates
RUN update-ca-certificates
RUN GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/selectel-exporter pkg/main.go

FROM alpine:3.14

COPY --from=builder /main /app/
WORKDIR /app
CMD ./main
FROM scratch
COPY --from=builder /go/bin/selectel-exporter /go/bin/selectel-exporter
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/go/bin/selectel-exporter"]
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Prometheus exporter для получения метрик облака [Selecte
Полученные данные нужно передать в переменные selectel.token и selectel.region соответственно.
```shell
helm repo add kts https://ktsstudio.github.io/helm-charts
helm install selexp --wait --set selectel.token=<token>,selectel.region=<region> kts/selectel-exporter
helm install selexp --wait --set selectel.token=<token>,selectel.region=<region> -n <namespace> kts/selectel-exporter
```
Если вы используете prometheus-operator, то укажите serviceMonitor.enabled=true и serviceMonitor.additionalLabels. В additionalLabels нужно указать label, которые указаны в [serviceMonitorSelector](https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/user-guides/getting-started.md).

Expand All @@ -27,6 +27,14 @@ export SELECTEL_REGION=<region>
./selectel-exporter
```

### Как проверить?

```shell
helm test selexp -n <namespace>
# или
curl --request GET --url 'http://<host>:9100/metrics'
```

# Доступные метрики

## Хранилище ([Datastore](https://developers.selectel.ru/docs/selectel-cloud-platform/dbaas_api/))
Expand All @@ -44,6 +52,7 @@ Label | Описание
project|имя проекта
datastore|имя хранилища
ip|адрес узла в кластере
role|является ли instance мастером или репликой

#### Пример
selectel_datastore_cpu{datastore="kts",ip="10.0.0.210",project="kts"} 1.787500000209541
Expand Down Expand Up @@ -76,6 +85,7 @@ project|имя проекта
datastore|имя хранилища
ip|адрес узла в кластере
database|имя базы данных
role|является ли instance мастером или репликой

#### Пример
selectel_database_tup_returned{database="kts",datastore="kts",ip="10.0.3.214",project="kts"} 2.1127298e+06
Expand Down
2 changes: 2 additions & 0 deletions pkg/exporter/dbcollector.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@ func (col *databaseCollector) registerGauge(metricName string, metric selapi.Dat
key := buildGaugeKey(metricName, metric.Ip, metric.DbName)
g, ok := col.metrics[key]
if !ok {
instance := col.datastore.GetInstance(metric.Ip)
g = prometheus.NewGauge(prometheus.GaugeOpts{
Name: metricName,
ConstLabels: prometheus.Labels{
"project": col.project.Name,
"datastore": col.datastore.Name,
"ip": metric.Ip,
"database": metric.DbName,
"role": instance.Role,
},
})
prometheus.MustRegister(g)
Expand Down
12 changes: 9 additions & 3 deletions pkg/exporter/dscollector.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type datastoreMetrics struct {
}

type datastoreCollector struct {
project selapi.Project
project selapi.Project
datastore selapi.Datastore
metrics map[string]*datastoreMetrics
}
Expand All @@ -31,9 +31,15 @@ func NewDatastoreCollector(project selapi.Project, datastore selapi.Datastore) *

func (col *datastoreCollector) registerGauge(name string, g prometheus.Gauge, ip string, value float64) prometheus.Gauge {
if g == nil {
instance := col.datastore.GetInstance(ip)
g = prometheus.NewGauge(prometheus.GaugeOpts{
Name: name,
ConstLabels: prometheus.Labels{"project": col.project.Name, "datastore": col.datastore.Name, "ip": ip},
Name: name,
ConstLabels: prometheus.Labels{
"project": col.project.Name,
"datastore": col.datastore.Name,
"ip": ip,
"role": instance.Role,
},
})
prometheus.MustRegister(g)
}
Expand Down
32 changes: 16 additions & 16 deletions pkg/exporter/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ type selectelCollector interface {
}

type exporter struct {
token string
region string
project selapi.Project
token string
region string
project selapi.Project
openstackAccountToken string
lastTokenUpdate time.Time
lastTokenUpdate time.Time

refreshPeriod time.Duration
stopCh chan bool
wg sync.WaitGroup
collectors []selectelCollector
stopCh chan bool
wg sync.WaitGroup
collectors []selectelCollector

datastores []selapi.Datastore
}
Expand All @@ -47,11 +47,11 @@ func Init(config *config.ExporterConfig, refreshPeriod time.Duration) (*exporter
}

e := &exporter{
token: config.Token,
region: config.Region,
project: project,
token: config.Token,
region: config.Region,
project: project,
refreshPeriod: refreshPeriod,
stopCh: make(chan bool),
stopCh: make(chan bool),
}
err = e.obtainToken()
if err != nil {
Expand Down Expand Up @@ -79,10 +79,10 @@ func (e *exporter) obtainToken() error {
}

func (e *exporter) checkToken() error {
if e.lastTokenUpdate.Sub(time.Now()) > 24 * time.Hour {
return e.obtainToken()
}
return nil
if time.Now().Sub(e.lastTokenUpdate) > 20*time.Hour {
return e.obtainToken()
}
return nil
}

func (e *exporter) fetchDatastores() error {
Expand Down Expand Up @@ -119,7 +119,7 @@ func (e *exporter) runCollectors() {
wg.Wait()
}

func (e *exporter) loop() {
func (e *exporter) loop() {
log.Println("exporter loop has started")
e.wg.Add(1)
for {
Expand Down
17 changes: 17 additions & 0 deletions pkg/selapi/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,27 @@ import (
"net/http"
)

type DatastoreInstance struct {
Hostname string `json:"hostname"`
IP string `json:"ip"`
Role string `json:"role"`
Status string `json:"status"`
}

type Datastore struct {
Id string `json:"id"`
Name string `json:"name"`
Enabled bool `json:"enabled"`
Instances []DatastoreInstance `json:"instances"`
}

func (d *Datastore) GetInstance(ip string) *DatastoreInstance {
for _, i := range d.Instances {
if i.IP == ip {
return &i
}
}
return &DatastoreInstance{}
}

type DatastoresResponse struct {
Expand Down

0 comments on commit 6e90292

Please sign in to comment.