1
0
mirror of https://github.com/prometheus-community/bind_exporter.git synced 2025-04-20 00:02:14 +03:00
2016-09-14 21:24:44 -04:00

137 lines
3.2 KiB
Go

package bind
import (
"encoding/xml"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"path"
"time"
)
// Client queries the BIND API, parses the response and returns stats in a
// generic format.
type Client interface {
Stats(...StatisticGroup) (Statistics, error)
}
// XMLClient is a generic BIND API client to retrieve statistics in XML format.
type XMLClient struct {
url string
http *http.Client
}
// NewXMLClient returns an initialized XMLClient.
func NewXMLClient(url string, c *http.Client) *XMLClient {
return &XMLClient{
url: url,
http: c,
}
}
// Get queries the given path and stores the result in the value pointed to by
// v. The endpoint must return a valid XML representation which can be
// unmarshaled into the provided value.
func (c *XMLClient) Get(p string, v interface{}) error {
u, err := url.Parse(c.url)
if err != nil {
return fmt.Errorf("invalid URL %q: %s", c.url, err)
}
u.Path = path.Join(u.Path, p)
resp, err := c.http.Get(u.String())
if err != nil {
return fmt.Errorf("error querying stats: %s", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("unexpected status %s", resp.Status)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("failed to read response: %s", err)
}
if err := xml.Unmarshal([]byte(body), v); err != nil {
return fmt.Errorf("failed to unmarshal XML response: %s", err)
}
return nil
}
const (
// QryRTT is the common prefix of query round-trip histogram counters.
QryRTT = "QryRTT"
)
// StatisticGroup describes a sub-group of BIND statistics.
type StatisticGroup string
// Available statistic groups.
const (
ServerStats StatisticGroup = "server"
ViewStats StatisticGroup = "view"
TaskStats StatisticGroup = "tasks"
)
// Statistics is a generic representation of BIND statistics.
type Statistics struct {
Server Server
Views []View
TaskManager TaskManager
}
// Server represents BIND server statistics.
type Server struct {
BootTime time.Time
ConfigTime time.Time
IncomingQueries []Counter
IncomingRequests []Counter
NameServerStats []Counter
}
// View represents statistics for a single BIND view.
type View struct {
Name string
Cache []Gauge
ResolverStats []Counter
ResolverQueries []Counter
}
// TaskManager contains information about all running tasks.
type TaskManager struct {
Tasks []Task `xml:"tasks>task"`
ThreadModel ThreadModel `xml:"thread-model"`
}
// Counter represents a single counter value.
type Counter struct {
Name string `xml:"name,attr"`
Counter uint `xml:",chardata"`
}
// Gauge represents a single gauge value.
type Gauge struct {
Name string `xml:"name"`
Gauge int `xml:"counter"`
}
// Task represents a single running task.
type Task struct {
ID string `xml:"id"`
Name string `xml:"name"`
Quantum uint `xml:"quantum"`
References uint `xml:"references"`
State string `xml:"state"`
}
// ThreadModel contains task and worker information.
type ThreadModel struct {
Type string `xml:"type"`
WorkerThreads uint `xml:"worker-threads"`
DefaultQuantum uint `xml:"default-quantum"`
TasksRunning uint `xml:"tasks-running"`
}