Skip to content

Commit

Permalink
Metrics for Designate (#103)
Browse files Browse the repository at this point in the history
* limits adn usage for cinder

* remove debug fmt

* add metrics to README

* remove commented lines
  • Loading branch information
alexeymyltsev committed Jul 1, 2020
1 parent b1af2c1 commit 533e022
Show file tree
Hide file tree
Showing 9 changed files with 288 additions and 3 deletions.
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ openstack_cinder_limits_volume_used_gb|tenant="demo-project",tenant_id="0c4e939a
openstack_cinder_volumes|region="RegionOne"|4.0 (float)
openstack_cinder_snapshots|region="RegionOne"|4.0 (float)
openstack_cinder_volume_status|region="RegionOne""id", "name", "status", "bootable", "tenant_id", "size", "volume_type"|4.0 (float)
openstack_designate_zones| region="RegionOne"|4.0 (float)
openstack_designate_zone_status| region="RegionOne""id", "name", "status", "tenant_id", "type"|4.0 (float)
openstack_designate_recordsets| region="RegionOne"|4.0 (float)
openstack_designate_recordsets_status| region="RegionOne""id", "name", "status", "zone_id", "zone_name", "type"|4.0 (float)
openstack_identity_domains|region="RegionOne"|1.0 (float)
openstack_identity_users|region="RegionOne"|30.0 (float)
openstack_identity_projects|region="RegionOne"|33.0 (float)
Expand Down Expand Up @@ -234,6 +238,21 @@ openstack_cinder_snapshots{region="Region"} 0.0
# HELP openstack_cinder_volumes volumes
# TYPE openstack_cinder_volumes gauge
openstack_cinder_volumes{region="Region"} 8.0
# HELP openstack_designate_recordsets recordsets
# TYPE openstack_designate_recordsets gauge
openstack_designate_recordsets 1
# HELP openstack_designate_recordsets_status recordsets_status
# TYPE openstack_designate_recordsets_status gauge
openstack_designate_recordsets_status{ZoneName="example.com.",id="f7b10e9b-0cae-4a91-b162-562bc6096648",name="example.org.",status="PENDING",type="A",zone_id="2150b1bf-dee2-4221-9d85-11f7886fb15f"} 0
# HELP openstack_designate_up up
# TYPE openstack_designate_up gauge
openstack_designate_up 1
# HELP openstack_designate_zone_status zone_status
# TYPE openstack_designate_zone_status gauge
openstack_designate_zone_status{id="a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",name="example.org.",status="ACTIVE",tenant_id="4335d1f0-f793-11e2-b778-0800200c9a66",type="PRIMARY"} 1
# HELP openstack_designate_zones zones
# TYPE openstack_designate_zones gauge
openstack_designate_zones 1
# HELP openstack_container_infra_cluster_status cluster_status
# TYPE openstack_container_infra_cluster_status gauge
openstack_container_infra_cluster_status{master_count="1",name="k8s",node_count="1",stack_id="31c1ee6c-081e-4f39-9f0f-f1d87a7defa1",status="CREATE_FAILED",uuid="273c39d5-fa17-4372-b6b1-93a572de2cef"} 1
Expand Down
113 changes: 113 additions & 0 deletions exporters/designate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package exporters

import (
"strings"

"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/prometheus/client_golang/prometheus"
)

type DesignateExporter struct {
BaseOpenStackExporter
}

var zone_status = []string{
"pending",
"active",
"deleted",
"error",
}

var recordset_status = []string{
"pending",
"active",
"deleted",
"error",
}

func mapZoneStatus(zoneStatus string) int {
for idx, status := range zone_status {
if status == strings.ToLower(zoneStatus) {
return idx
}
}
return -1
}

func mapRecordsetStatus(recordsetStatus string) int {
for idx, status := range recordset_status {
if status == strings.ToLower(recordsetStatus) {
return idx
}
}
return -1
}

var defaultDesignateMetrics = []Metric{
{Name: "zones", Fn: ListZonesAndRecordsets},
{Name: "zone_status", Labels: []string{"id", "name", "status", "tenant_id", "type"}, Fn: nil},
{Name: "recordsets", Fn: nil},
{Name: "recordsets_status", Labels: []string{"id", "name", "status", "zone_id", "zone_name", "type"}, Fn: nil},
}

func NewDesignateExporter(client *gophercloud.ServiceClient, prefix string, disabledMetrics []string) (*DesignateExporter, error) {
exporter := DesignateExporter{
BaseOpenStackExporter{
Name: "designate",
Prefix: prefix,
Client: client,
DisabledMetrics: disabledMetrics,
},
}
for _, metric := range defaultDesignateMetrics {
exporter.AddMetric(metric.Name, metric.Fn, metric.Labels, nil)
}

return &exporter, nil
}

func ListZonesAndRecordsets(exporter *BaseOpenStackExporter, ch chan<- prometheus.Metric) error {
allPagesZones, err := zones.List(exporter.Client, zones.ListOpts{}).AllPages()
if err != nil {
return err
}

allZones, err := zones.ExtractZones(allPagesZones)
if err != nil {
return err
}

ch <- prometheus.MustNewConstMetric(exporter.Metrics["zones"].Metric,
prometheus.GaugeValue, float64(len(allZones)))

// Collect recordsets for zone and write metrics for zones and recordsets
for _, zone := range allZones {

allPagesRecordsets, err := recordsets.ListByZone(exporter.Client, zone.ID, recordsets.ListOpts{}).AllPages()
if err != nil {
return err
}

allRecordsets, err := recordsets.ExtractRecordSets(allPagesRecordsets)
if err != nil {
return err
}

ch <- prometheus.MustNewConstMetric(exporter.Metrics["recordsets"].Metric,
prometheus.GaugeValue, float64(len(allRecordsets)))

for _, recordset := range allRecordsets {
ch <- prometheus.MustNewConstMetric(exporter.Metrics["recordsets_status"].Metric,
prometheus.GaugeValue, float64(mapRecordsetStatus(recordset.Status)), recordset.ID, recordset.Name,
recordset.Status, recordset.ZoneID, recordset.ZoneName, recordset.Type)
}

ch <- prometheus.MustNewConstMetric(exporter.Metrics["zone_status"].Metric,
prometheus.GaugeValue, float64(mapZoneStatus(zone.Status)), zone.ID, zone.Name,
zone.Status, zone.ProjectID, zone.Type)
}

return nil
}
49 changes: 49 additions & 0 deletions exporters/designate_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package exporters

import (
"strings"

"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/assert"
)

type DesignateTestSuite struct {
BaseOpenStackTestSuite
}

var designateExpectedUp = `
# HELP openstack_designate_recordsets recordsets
# TYPE openstack_designate_recordsets gauge
openstack_designate_recordsets 1
# HELP openstack_designate_recordsets_status recordsets_status
# TYPE openstack_designate_recordsets_status gauge
openstack_designate_recordsets_status{id="f7b10e9b-0cae-4a91-b162-562bc6096648",name="example.org.",status="PENDING",type="A",zone_id="2150b1bf-dee2-4221-9d85-11f7886fb15f",zone_name="example.com."} 0
# HELP openstack_designate_up up
# TYPE openstack_designate_up gauge
openstack_designate_up 1
# HELP openstack_designate_zone_status zone_status
# TYPE openstack_designate_zone_status gauge
openstack_designate_zone_status{id="a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",name="example.org.",status="ACTIVE",tenant_id="4335d1f0-f793-11e2-b778-0800200c9a66",type="PRIMARY"} 1
# HELP openstack_designate_zones zones
# TYPE openstack_designate_zones gauge
openstack_designate_zones 1
`

var designateExpectedDown = `
# HELP openstack_designate_up up
# TYPE openstack_designate_up gauge
openstack_designate_up 0
`

func (suite *DesignateTestSuite) TestDesignateExporter() {
err := testutil.CollectAndCompare(*suite.Exporter, strings.NewReader(designateExpectedUp))
assert.NoError(suite.T(), err)
}

func (suite *DesignateTestSuite) TestDesignateExporterWithEndpointDown() {
suite.teardownFixtures()
defer suite.installFixtures()

err := testutil.CollectAndCompare(*suite.Exporter, strings.NewReader(designateExpectedDown))
assert.NoError(suite.T(), err)
}
7 changes: 7 additions & 0 deletions exporters/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,13 @@ func NewExporter(name, prefix, cloud string, disabledMetrics []string, endpointT
return nil, err
}
}
case "dns":
{
exporter, err = NewDesignateExporter(client, prefix, disabledMetrics)
if err != nil {
return nil, err
}
}
default:
{
return nil, fmt.Errorf("couldn't find a handler for %s exporter", name)
Expand Down
3 changes: 3 additions & 0 deletions exporters/exporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ var fixtures map[string]string = map[string]string{
"/volumes/os-quota-sets/4b1eb781a47440acb8af9850103e537f?usage=true": "cinder_os_quota_sets",
"/volumes/os-quota-sets/5961c443439d4fcebe42643723755e9d?usage=true": "cinder_os_quota_sets",
"/volumes/os-quota-sets/fdb8424c4e4f4c0ba32c52e2de3bd80e?usage=true": "cinder_os_quota_sets",
"/designate/v2/zones": "designate_zones",
"/designate/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3/recordsets": "designate_recordsets",
}

func (suite *BaseOpenStackTestSuite) SetupTest() {
Expand Down Expand Up @@ -149,4 +151,5 @@ func TestOpenStackSuites(t *testing.T) {
suite.Run(t, &NeutronTestSuite{BaseOpenStackTestSuite: BaseOpenStackTestSuite{ServiceName: "network"}})
suite.Run(t, &GlanceTestSuite{BaseOpenStackTestSuite: BaseOpenStackTestSuite{ServiceName: "image"}})
suite.Run(t, &ContainerInfraTestSuite{BaseOpenStackTestSuite: BaseOpenStackTestSuite{ServiceName: "container-infra"}})
suite.Run(t, &DesignateTestSuite{BaseOpenStackTestSuite: BaseOpenStackTestSuite{ServiceName: "dns"}})
}
31 changes: 31 additions & 0 deletions exporters/fixtures/designate_recordsets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"recordsets": [
{
"description": "This is an example record set.",
"links": {
"self": "https://127.0.0.1:9001/v2/zones/2150b1bf-dee2-4221-9d85-11f7886fb15f/recordsets/f7b10e9b-0cae-4a91-b162-562bc6096648"
},
"updated_at": null,
"records": [
"10.1.0.2"
],
"ttl": 3600,
"id": "f7b10e9b-0cae-4a91-b162-562bc6096648",
"name": "example.org.",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"zone_id": "2150b1bf-dee2-4221-9d85-11f7886fb15f",
"zone_name": "example.com.",
"created_at": "2014-10-24T19:59:44.000000",
"version": 1,
"type": "A",
"status": "PENDING",
"action": "CREATE"
}
],
"links": {
"self": "http:https://127.0.0.1:9001/v2/zones/2150b1bf-dee2-4221-9d85-11f7886fb15f/recordsets?limit=1"
},
"metadata": {
"total_count": 2
}
}
34 changes: 34 additions & 0 deletions exporters/fixtures/designate_zones.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"zones": [
{
"id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.org.",
"email": "[email protected]",
"ttl": 7200,
"serial": 1404757531,
"status": "ACTIVE",
"action": "CREATE",
"description": "This is an example zone.",
"masters": [],
"type": "PRIMARY",
"transferred_at": null,
"version": 1,
"created_at": "2014-07-07T18:25:31.275934",
"updated_at": null,
"attributes": {
"tier": "gold", "ha": "true"
},
"links": {
"self": "https://127.0.0.1:9001/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
}
}
],
"links": {
"self": "http:https://127.0.0.1:9001/v2/zones?limit=1"
},
"metadata": {
"total_count": 2
}
}
28 changes: 28 additions & 0 deletions exporters/fixtures/tokens.json
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,34 @@
"type": "container-infra",
"id": "413a44234e1a4c3781d4a3c7a7e4c895",
"name": "magnum"
},
{
"endpoints": [
{
"url": "http:https://test.cloud/designate",
"interface": "public",
"region": "RegionOne",
"region_id": "RegionOne",
"id": "1c4ffe935e7643d99b55938cb12bc38d"
},
{
"url": "http:https://test.cloud/designate",
"interface": "internal",
"region": "RegionOne",
"region_id": "RegionOne",
"id": "1c4ffe935e7643d99b55938cb12bc38d"
},
{
"url": "http:https://test.cloud/designate",
"interface": "admin",
"region": "RegionOne",
"region_id": "RegionOne",
"id": "1c4ffe935e7643d99b55938cb12bc38d"
}
],
"type": "dns",
"id": "413a44234e1a4c3781d4a3c7a7e4c895",
"name": "dns"
}
],
"expires_at": "2100-11-07T02:58:43.578887Z",
Expand Down
7 changes: 4 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ package main

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

"github.com/openstack-exporter/openstack-exporter/exporters"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/common/log"
"github.com/prometheus/common/version"
"gopkg.in/alecthomas/kingpin.v2"
"net/http"
"os"
)

var defaultEnabledServices = []string{"network", "compute", "image", "volume", "identity", "object-store", "load-balancer", "container-infra"}
var defaultEnabledServices = []string{"network", "compute", "image", "volume", "identity", "object-store", "load-balancer", "container-infra", "dns"}
var DEFAULT_OS_CLIENT_CONFIG = "/etc/openstack/clouds.yaml"

func main() {
Expand Down

0 comments on commit 533e022

Please sign in to comment.