package mssql
import (
"context"
_ "embed"
"fmt"
"github.com/burningalchemist/sql_exporter"
"github.com/burningalchemist/sql_exporter/config"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus"
dto "github.com/prometheus/client_model/go"
"gopkg.in/yaml.v2"
)
var collectorConfigBytes []byte
var collectorConfig config.CollectorConfig
func init() {
err := yaml.Unmarshal(collectorConfigBytes, &collectorConfig)
if err != nil {
panic(fmt.Errorf("failed to unmarshal mssql integration collector config: %w", err))
}
}
type targetCollectorAdapter struct {
target sql_exporter.Target
logger log.Logger
}
func newTargetCollectorAdapter(t sql_exporter.Target, l log.Logger) targetCollectorAdapter {
return targetCollectorAdapter{
target: t,
logger: l,
}
}
func (t targetCollectorAdapter) Collect(m chan<- prometheus.Metric) {
sqlMetrics := make(chan sql_exporter.Metric)
go func() {
t.target.Collect(context.Background(), sqlMetrics)
close(sqlMetrics)
}()
for metric := range sqlMetrics {
m <- sqlPrometheusMetricAdapter{
Metric: metric,
logger: t.logger,
}
}
}
func (t targetCollectorAdapter) Describe(chan<- *prometheus.Desc) {}
type sqlPrometheusMetricAdapter struct {
sql_exporter.Metric
logger log.Logger
}
func (s sqlPrometheusMetricAdapter) Write(m *dto.Metric) error {
return s.Metric.Write(m)
}
func (s sqlPrometheusMetricAdapter) Desc() *prometheus.Desc {
sqlDesc := s.Metric.Desc()
if sqlDesc == nil {
err := s.Metric.Write(nil)
level.Error(s.logger).Log("msg", "Invalid metric description.", "err", err)
return prometheus.NewInvalidDesc(err)
}
constLabelsDtos := sqlDesc.ConstLabels()
constLabels := make(map[string]string, len(constLabelsDtos))
for _, l := range constLabelsDtos {
constLabels[l.GetName()] = l.GetValue()
}
return prometheus.NewDesc(
sqlDesc.Name(),
sqlDesc.Help(),
sqlDesc.Labels(),
constLabels,
)
}