SoFunction
Updated on 2025-04-11

golang gets prometheus data (prometheus/client_golang package)

1. Create a link

1.1 Syntax

  • grammar
func NewClient(cfg Config) (Client, error)
  • Structure
type Config struct {
    Address      string
    Client       *
    RoundTripper 
}
  • Example
	client, err = ({
		Address: "http://10.10.182.112:9090",
	})

1.2 Complete Example

package main

import (
	"fmt"
	"/prometheus/client_golang/api"
)

func CreatClient() (client , err error) {
	client, err = ({
		Address: "http://10.10.182.112:9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		return nil, err
	}
	return client, nil
}


func main() {
	client, err := CreatClient()
	if err != nil {
		("%+v", err)
	}
	if client != nil {
		("Client creation successfully")
	}
}

2. Simple query

2.1 Syntax

  • Create an API instance
func NewAPI(c Client) API
  • Query
func (API) Query(ctx , query string, ts , opts ...Option) (Value, Warnings, error)
  • Set timeout in context
func WithTimeout(parent Context, timeout ) (Context, CancelFunc)
  • Syntax example
	v1api := (Client)
	ctx := ()
	result, warnings, err := (ctx, "up", (), (5*))

2.2 Complete Example

package main

import (
	"context"
	"fmt"
	"/prometheus/client_golang/api"
	proV1 "/prometheus/client_golang/api/prometheus/v1"
	"/prometheus/common/model"
	"time"
)

var Client 

func init() {
	Client, _ = CreatClient()
}

func CreatClient() (client , err error) {
	client, err = ({
		Address: "http://10.10.181.112:9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		return nil, err
	}
	return client, nil
}

func Query() (result , err error) {
	v1api := (Client)
	ctx, cancel := ((), 10*)
	defer cancel()
	result, warnings, err := (ctx, "up", (), (5*))
	if err != nil {
		return nil, err
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	return result, nil
}

func main() {
	result, err := Query()
	if err != nil {
		("%q", err)
	}
	("Result:\n%v\n", result)
}

3. Range value query

3.1 Syntax

  • Range settings
type Range struct {
    Start, End 
    Step       
}

Syntax example

	r := {
		Start: ().Add(-),
		End:   (),
		Step:  ,
	}
  • Range query
func (API) QueryRange(ctx , query string, r Range, opts ...Option) (Value, Warnings, error)

Syntax example

result, warnings, err := (ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, (5*))

3.2 Complete Example

package main

import (
	"context"
	"fmt"
	"/prometheus/client_golang/api"
	proV1 "/prometheus/client_golang/api/prometheus/v1"
	"/prometheus/common/model"
	"time"
)

var Client 

func init() {
	Client, _ = CreatClient()
}

func CreatClient() (client , err error) {
	client, err = ({
		Address: "http://10.10.181.112:9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		return nil, err
	}
	return client, nil
}

func QueryRange() (result , err error) {
	v1api := (Client)
	//ctx := ()
	ctx, cancel := ((), 10*)
	r := {
		Start: ().Add(-),
		End:   (),
		Step:  ,
	}
	defer cancel()
	result, warnings, err := (ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, (5*))
	if err != nil {
		return nil, err
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	return result, nil
}

func main() {
	result, err := QueryRange()
	if err != nil {
		("%q", err)
	}
	("Result:\n%v\n", result)
}

4. Get the metric name and label

4.1 Syntax

  • grammar
func (API) Series(ctx , matches []string, startTime , endTime ) ([], Warnings, error)
  • Syntax example
	lbls, warnings, err := (ctx, []string{
		"{__name__=~\".+\",job=\"prometheus\"}",
	}, ().Add(-), ())

illustrate:

  • You can write multiple items in the array
  • __name__Represents the indicator name, and regular matching is supported after the equal sign.
  • You can connect some labels later, and the regularity is also supported.

For example, in the examplejob=\"prometheus\", is the job name we wrote in the prometheus configuration file.

  • LabelSet
type LabelSet map[LabelName]LabelValue

You can see that the LabelSet is actually a map, so we can only print the metric name in the example:

	for _, lbl := range lbls {
		(lbl["__name__"])
	}

4.1 Complete example (get all data entries)

package main

import (
	"context"
	"fmt"
	"os"
	"time"

	"/prometheus/client_golang/api"
	proV1 "/prometheus/client_golang/api/prometheus/v1"
)

var Client 

func init() {
	Client, _ = CreatClient()
}

func CreatClient() (client , err error) {
	client, err = ({
		Address: "http://10.10.181.112:9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		return nil, err
	}
	return client, nil
}

func ExampleAPI_series() {
	v1api := (Client)
	ctx, cancel := ((), 10*)
	defer cancel()
	lbls, warnings, err := (ctx, []string{
		//"{__name__=~\"scrape_.+\",job=\"node\"}",
		"{__name__=~\".+\"}",
	}, ().Add(-), ())
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:", len(lbls))
	for _, lbl := range lbls {
		//(lbl["__name__"])
		(lbl)
	}
}
func main() {
	ExampleAPI_series()
}

【Official examples attached】

/prometheus/client_golang/blob/main/api/prometheus/v1/example_test.go

package v1_test

import (
	"context"
	"fmt"
	"net/http"
	"os"
	"time"

	"/prometheus/common/config"

	"/prometheus/client_golang/api"
	v1 "/prometheus/client_golang/api/prometheus/v1"
)

func ExampleAPI_query() {
	client, err := ({
		Address: ":9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		(1)
	}

	v1api := (client)
	ctx, cancel := ((), 10*)
	defer cancel()
	result, warnings, err := (ctx, "up", (), (5*))
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:\n%v\n", result)
}

func ExampleAPI_queryRange() {
	client, err := ({
		Address: ":9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		(1)
	}

	v1api := (client)
	ctx, cancel := ((), 10*)
	defer cancel()
	r := {
		Start: ().Add(-),
		End:   (),
		Step:  ,
	}
	result, warnings, err := (ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, (5*))
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:\n%v\n", result)
}

type userAgentRoundTripper struct {
	name string
	rt   
}

// RoundTrip implements the  interface.
func (u userAgentRoundTripper) RoundTrip(r *) (*, error) {
	if () == "" {
		// The specification of  says that it shouldn't mutate
		// the request so make a copy of  since this is all that is
		// modified.
		r2 := new()
		*r2 = *r
		 = make()
		for k, s := range  {
			[k] = s
		}
		("User-Agent", )
		r = r2
	}
	return (r)
}

func ExampleAPI_queryRangeWithUserAgent() {
	client, err := ({
		Address:      ":9090",
		RoundTripper: userAgentRoundTripper{name: "Client-Golang", rt: },
	})
	if err != nil {
		("Error creating client: %v\n", err)
		(1)
	}

	v1api := (client)
	ctx, cancel := ((), 10*)
	defer cancel()
	r := {
		Start: ().Add(-),
		End:   (),
		Step:  ,
	}
	result, warnings, err := (ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r)
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:\n%v\n", result)
}

func ExampleAPI_queryRangeWithBasicAuth() {
	client, err := ({
		Address: ":9090",
		// We can use amazing /prometheus/common/config helper!
		RoundTripper: ("me", "defintely_me", "", ),
	})
	if err != nil {
		("Error creating client: %v\n", err)
		(1)
	}

	v1api := (client)
	ctx, cancel := ((), 10*)
	defer cancel()
	r := {
		Start: ().Add(-),
		End:   (),
		Step:  ,
	}
	result, warnings, err := (ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r)
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:\n%v\n", result)
}

func ExampleAPI_queryRangeWithAuthBearerToken() {
	client, err := ({
		Address: ":9090",
		// We can use amazing /prometheus/common/config helper!
		RoundTripper: ("Bearer", "secret_token", ),
	})
	if err != nil {
		("Error creating client: %v\n", err)
		(1)
	}

	v1api := (client)
	ctx, cancel := ((), 10*)
	defer cancel()
	r := {
		Start: ().Add(-),
		End:   (),
		Step:  ,
	}
	result, warnings, err := (ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r)
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:\n%v\n", result)
}

func ExampleAPI_series() {
	client, err := ({
		Address: ":9090",
	})
	if err != nil {
		("Error creating client: %v\n", err)
		(1)
	}

	v1api := (client)
	ctx, cancel := ((), 10*)
	defer cancel()
	lbls, warnings, err := (ctx, []string{
		"{__name__=~\"scrape_.+\",job=\"node\"}",
		"{__name__=~\"scrape_.+\",job=\"prometheus\"}",
	}, ().Add(-), ())
	if err != nil {
		("Error querying Prometheus: %v\n", err)
		(1)
	}
	if len(warnings) > 0 {
		("Warnings: %v\n", warnings)
	}
	("Result:")
	for _, lbl := range lbls {
		(lbl)
	}
}

This is the article about golang obtaining prometheus data (prometheus/client_golang package) introduced here. For more related golang obtaining prometheus content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!