Skip to content

Commit 8489ff4

Browse files
committed
add parameterizable duration to retrieve data from prometheus
Signed-off-by: Augustin Husson <husson.augustin@gmail.com>
1 parent 4a83989 commit 8489ff4

File tree

6 files changed

+46
-11
lines changed

6 files changed

+46
-11
lines changed

cmd/promql-langserver/promql-langserver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func main() {
5858

5959
logger = kitlog.NewSyncLogger(logger)
6060

61-
handler, err := rest.CreateInstHandler(context.Background(), prometheusClient, logger)
61+
handler, err := rest.CreateInstHandler(context.Background(), prometheusClient, logger, config.Interval)
6262
if err != nil {
6363
log.Fatal(err)
6464
}

langserver/completion.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ func (s *server) completeLabel(ctx context.Context, completions *[]protocol.Comp
312312
if vs != nil {
313313
metricName = vs.Name
314314
}
315-
allNames, err := s.metadataService.LabelNames(ctx, metricName, time.Now().Add(-100*time.Hour), time.Now())
315+
allNames, err := s.metadataService.LabelNames(ctx, metricName, time.Now().Add(time.Duration(-1*s.config.Interval)), time.Now())
316316
if err != nil {
317317
// nolint: errcheck
318318
s.client.LogMessage(s.lifetime, &protocol.LogMessageParams{
@@ -355,7 +355,7 @@ OUTER:
355355

356356
// nolint: funlen
357357
func (s *server) completeLabelValue(ctx context.Context, completions *[]protocol.CompletionItem, location *cache.Location, labelName string) error {
358-
labelValues, err := s.metadataService.LabelValues(ctx, labelName, time.Now().Add(-100*time.Hour), time.Now())
358+
labelValues, err := s.metadataService.LabelValues(ctx, labelName, time.Now().Add(time.Duration(-1*s.config.Interval)), time.Now())
359359
if err != nil {
360360
// nolint: errcheck
361361
s.client.LogMessage(s.lifetime, &protocol.LogMessageParams{

langserver/config.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,24 @@ import (
2020
"net/url"
2121
"os"
2222
"strconv"
23+
"time"
2324

2425
"github.com/kelseyhightower/envconfig"
2526
"github.com/prometheus-community/promql-langserver/internal/vendored/go-tools/lsp/protocol"
27+
"github.com/prometheus/common/model"
2628
"gopkg.in/yaml.v3"
2729
)
2830

31+
const defaultInterval = model.Duration(12 * 3600 * time.Second)
32+
2933
// Config contains the configuration for a server.
3034
type Config struct {
3135
RPCTrace string `yaml:"rpc_trace"`
3236
LogFormat LogFormat `yaml:"log_format"`
3337
PrometheusURL string `yaml:"prometheus_url"`
3438
RESTAPIPort uint64 `yaml:"rest_api_port"`
39+
// Interval is the time in second used to retrieve label and metrics from Prometheus
40+
Interval model.Duration `yaml:"interval"`
3541
}
3642

3743
// LogFormat is the type used for describing the format of logs.
@@ -49,6 +55,7 @@ var mapLogFormat = map[LogFormat]bool{ // nolint: gochecknoglobals
4955
TextFormat: true,
5056
}
5157

58+
// Parameterizable
5259
// UnmarshalYAML overrides a function used internally by the yaml.v3 lib.
5360
func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
5461
tmp := &Config{}
@@ -72,6 +79,7 @@ func (c *Config) unmarshalENV() error {
7279
// the envconfig lib is not able to convert an empty string to the value 0
7380
// so we have to convert it manually
7481
RESTAPIPort string
82+
Interval string
7583
}{}
7684
if err := envconfig.Process(prefix, conf); err != nil {
7785
return err
@@ -83,6 +91,13 @@ func (c *Config) unmarshalENV() error {
8391
return parseError
8492
}
8593
}
94+
if len(conf.Interval) > 0 {
95+
var parseError error
96+
c.Interval, parseError = model.ParseDuration(conf.Interval)
97+
if parseError != nil {
98+
return parseError
99+
}
100+
}
86101
c.RPCTrace = conf.RPCTrace
87102
c.PrometheusURL = conf.PrometheusURL
88103
c.LogFormat = LogFormat(conf.LogFormat)
@@ -105,6 +120,9 @@ func (c *Config) Validate() error {
105120
// default value
106121
c.LogFormat = TextFormat
107122
}
123+
if c.Interval <= 0 {
124+
c.Interval = defaultInterval
125+
}
108126

109127
return nil
110128
}

langserver/config_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func TestUnmarshalENV(t *testing.T) {
3131
variables: map[string]string{},
3232
expected: &Config{
3333
LogFormat: TextFormat,
34+
Interval: defaultInterval,
3435
},
3536
},
3637
{
@@ -40,12 +41,14 @@ func TestUnmarshalENV(t *testing.T) {
4041
"LANGSERVER_PROMETHEUSURL": "http://localhost:9090",
4142
"LANGSERVER_RESTAPIPORT": "8080",
4243
"LANGSERVER_LOGFORMAT": "json",
44+
"LANGSERVER_INTERVAL": "1w",
4345
},
4446
expected: &Config{
4547
RPCTrace: "text",
4648
PrometheusURL: "http://localhost:9090",
4749
RESTAPIPort: 8080,
4850
LogFormat: JSONFormat,
51+
Interval: 604800000000000,
4952
},
5053
},
5154
}

langserver/server.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"sync"
3030

3131
promClient "github.com/prometheus-community/promql-langserver/prometheus"
32+
"github.com/prometheus/common/model"
3233

3334
"github.com/go-kit/kit/log"
3435
"github.com/prometheus-community/promql-langserver/internal/vendored/go-tools/jsonrpc2"
@@ -83,11 +84,18 @@ func (s Server) Run() error {
8384
// CreateHeadlessServer creates a locked down server instance for the REST API.
8485
//
8586
// "locked down" in this case means, that the instance cannot send or receive any JSONRPC communication. Logging messages that the instance tries to send over JSONRPC are redirected to stderr.
86-
func CreateHeadlessServer(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger) (HeadlessServer, error) {
87+
func CreateHeadlessServer(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger, interval model.Duration) (HeadlessServer, error) {
88+
conf := &Config{
89+
PrometheusURL: metadataService.GetURL(),
90+
Interval: interval,
91+
}
92+
if interval <= 0 {
93+
conf.Interval = defaultInterval
94+
}
8795
s := &server{
8896
client: &headlessClient{logger: logger},
8997
headless: true,
90-
config: &Config{PrometheusURL: metadataService.GetURL()},
98+
config: conf,
9199
metadataService: metadataService,
92100
}
93101

rest/handler.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/prometheus-community/promql-langserver/internal/vendored/go-tools/lsp/protocol"
2727
"github.com/prometheus-community/promql-langserver/langserver"
2828
promClient "github.com/prometheus-community/promql-langserver/prometheus"
29+
"github.com/prometheus/common/model"
2930

3031
"github.com/prometheus/client_golang/prometheus"
3132
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -38,8 +39,10 @@ import (
3839
// otherwise you need to provide your own implementation of the interface.
3940
//
4041
// The provided Logger should be synchronized.
41-
func CreateHandler(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger) (http.Handler, error) {
42-
return createHandler(ctx, metadataService, logger, false)
42+
//
43+
// interval is the period of time (in second) used to retrieve data such as label and metrics from metrics.
44+
func CreateHandler(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger, interval model.Duration) (http.Handler, error) {
45+
return createHandler(ctx, metadataService, logger, false, interval)
4346
}
4447

4548
// CreateInstHandler creates an instrumented http.Handler for the PromQL langserver REST API.
@@ -53,11 +56,14 @@ func CreateHandler(ctx context.Context, metadataService promClient.MetadataServi
5356
// otherwise you need to provide your own implementation of the interface.
5457
//
5558
// The provided Logger should be synchronized.
56-
func CreateInstHandler(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger) (http.Handler, error) {
57-
return createHandler(ctx, metadataService, logger, true)
59+
//
60+
// interval is the period of time (in second) used to retrieve data such as label and metrics from metrics.
61+
func CreateInstHandler(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger, interval model.Duration) (http.Handler, error) {
62+
return createHandler(ctx, metadataService, logger, true, interval)
5863
}
59-
func createHandler(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger, metricsEnpoint bool) (http.Handler, error) {
60-
lgs, err := langserver.CreateHeadlessServer(ctx, metadataService, logger)
64+
65+
func createHandler(ctx context.Context, metadataService promClient.MetadataService, logger log.Logger, metricsEnpoint bool, interval model.Duration) (http.Handler, error) {
66+
lgs, err := langserver.CreateHeadlessServer(ctx, metadataService, logger, interval)
6167
if err != nil {
6268
return nil, err
6369
}

0 commit comments

Comments
 (0)