Skip to content

Commit

Permalink
Merge pull request #2036 from NetApp/rg2-merge-23.05
Browse files Browse the repository at this point in the history
feat: merge 23.05 to main
  • Loading branch information
cgrinds authored May 3, 2023
2 parents b0f9af3 + ec7dd43 commit 34be25d
Show file tree
Hide file tree
Showing 20 changed files with 506 additions and 151 deletions.
298 changes: 296 additions & 2 deletions CHANGELOG.md

Large diffs are not rendered by default.

14 changes: 8 additions & 6 deletions cmd/collectors/ems/ems.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/netapp/harvest/v2/cmd/tools/rest"
"github.com/netapp/harvest/v2/pkg/errs"
"github.com/netapp/harvest/v2/pkg/matrix"
"github.com/netapp/harvest/v2/pkg/set"
"github.com/netapp/harvest/v2/pkg/tree/node"
"github.com/netapp/harvest/v2/pkg/util"
"github.com/tidwall/gjson"
Expand Down Expand Up @@ -38,7 +39,7 @@ type Ems struct {
DefaultLabels []string
severityFilter string
eventNames []string // consist of all ems events supported
bookendEmsMap map[string][]string // This is reverse bookend ems map, [Resolving ems]:[Issuing ems slice]
bookendEmsMap map[string]*set.Set // This is reverse bookend ems map, [Resolving ems]:[Set of Issuing ems]. Using Set here to ensure that it has slice of unique issuing ems
resolveAfter time.Duration
}

Expand Down Expand Up @@ -93,7 +94,7 @@ func (e *Ems) Init(a *collector.AbstractCollector) error {
// init ems props
e.InitEmsProp()

e.bookendEmsMap = make(map[string][]string)
e.bookendEmsMap = make(map[string]*set.Set)

if err = e.InitClient(); err != nil {
return err
Expand Down Expand Up @@ -323,7 +324,7 @@ func (e *Ems) PollInstance() (map[string]*matrix.Matrix, error) {

// check instance timestamp and remove it after given resolve_after duration and warning when total instance in cache > 1000 instance
for _, issuingEmsList := range e.bookendEmsMap {
for _, issuingEms := range issuingEmsList {
for _, issuingEms := range issuingEmsList.Slice() {
if mx := e.Matrix[issuingEms]; mx != nil {
for instanceKey, instance := range mx.GetInstances() {
if metr, ok = mx.GetMetrics()["timestamp"]; !ok {
Expand Down Expand Up @@ -531,7 +532,7 @@ func (e *Ems) HandleResults(result []gjson.Result, prop map[string][]*emsProp) (
- loop would iterate for all possible issuing ems
- if one or more issuing ems exist then resolve all matching ems else log warning as unable to find matching ems in cache
*/
for _, issuingEms := range issuingEmsList {
for _, issuingEms := range issuingEmsList.Slice() {
if mx = m[issuingEms]; mx != nil {
metr, exist := mx.GetMetrics()["events"]
if !exist {
Expand All @@ -557,7 +558,7 @@ func (e *Ems) HandleResults(result []gjson.Result, prop map[string][]*emsProp) (
}

if !emsResolved {
e.Logger.Warn().Str("resolving ems", msgName).Str("issue ems", strings.Join(issuingEmsList, ",")).
e.Logger.Warn().Str("resolving ems", msgName).Str("issue ems", strings.Join(issuingEmsList.Slice(), ",")).
Msg("Unable to find matching issue ems in cache")
}
} else {
Expand Down Expand Up @@ -700,7 +701,7 @@ func (e *Ems) updateMatrix() {
tempMap := make(map[string]*matrix.Matrix)
// store the bookend ems metric in tempMap
for _, issuingEmsList := range e.bookendEmsMap {
for _, issuingEms := range issuingEmsList {
for _, issuingEms := range issuingEmsList.Slice() {
if mx, exist := e.Matrix[issuingEms]; exist {
tempMap[issuingEms] = mx
}
Expand All @@ -715,6 +716,7 @@ func (e *Ems) updateMatrix() {
for issuingEms, mx := range tempMap {
if metr, ok = mx.GetMetrics()["events"]; !ok {
e.Logger.Error().
Str("issuingEms", issuingEms).
Str("name", "events").
Msg("failed to get metric")
continue
Expand Down
7 changes: 6 additions & 1 deletion cmd/collectors/ems/templating.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ems

import (
"github.com/netapp/harvest/v2/pkg/set"
"github.com/netapp/harvest/v2/pkg/tree/node"
"github.com/netapp/harvest/v2/pkg/util"
"time"
Expand Down Expand Up @@ -151,6 +152,10 @@ func (e *Ems) ParseResolveEms(resolveEvent *node.Node, issueEmsProp emsProp) {
}
e.Logger.Debug().Str("bookend ems resolve After", e.resolveAfter.String()).Msg("")

e.bookendEmsMap[resolveEmsName] = append(e.bookendEmsMap[resolveEmsName], issueEmsProp.Name)
// Using Set to ensure it has slice of unique issuing ems
if _, ok := e.bookendEmsMap[resolveEmsName]; !ok {
e.bookendEmsMap[resolveEmsName] = set.New()
}
e.bookendEmsMap[resolveEmsName].Add(issueEmsProp.Name)
e.emsProp[resolveEmsName] = append(e.emsProp[resolveEmsName], &prop)
}
5 changes: 3 additions & 2 deletions cmd/collectors/rest/plugins/qtree/qtree.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,13 +230,14 @@ func (my Qtree) handlingHistoricalMetrics(result []gjson.Result, data *matrix.Ma
my.Logger.Debug().Msgf("add (%s) quota instance: %s.%s.%s.%s", quotaInstanceKey, vserver, volume, tree, qIndex)
}

qtreeInstance := data.GetInstance(vserver + volume + tree)
// qtree instancekey would be qtree, svm and volume(sorted keys)
qtreeInstance := data.GetInstance(tree + vserver + volume)
if qtreeInstance == nil {
my.Logger.Warn().
Str("tree", tree).
Str("volume", volume).
Str("vserver", vserver).
Msg("No instance matching tree.volume.vserver")
Msg("No instance matching tree.vserver.volume")
continue
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/collectors/zapi/plugins/qtree/qtree.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ func (my Qtree) handlingHistoricalMetrics(quotas []*node.Node, data *matrix.Matr
if my.client.IsClustered() {
qtreeInstance = data.GetInstance(tree + "." + volume + "." + vserver)
} else {
qtreeInstance = data.GetInstance(volume + "." + tree)
qtreeInstance = data.GetInstance(tree + "." + volume)
}
if qtreeInstance == nil {
my.Logger.Warn().
Expand Down
21 changes: 21 additions & 0 deletions cmd/tools/generate/counter.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ var (
"workload_detail.yaml": {},
"workload_detail_volume.yaml": {},
}
excludeCounters = map[string]struct{}{
"write_latency_histogram": {},
"read_latency_histogram": {},
"latency_histogram": {},
"nfsv3_latency_hist": {},
"read_latency_hist": {},
"write_latency_hist": {},
}
)

type Counters struct {
Expand Down Expand Up @@ -243,6 +251,9 @@ func processRestConfigCounters(path string) map[string]Counter {
for _, c := range templateCounters.GetAllChildContentS() {
if c != "" {
name, display, m, _ := util.ParseMetric(c)
if _, ok := excludeCounters[name]; ok {
continue
}
description := searchDescriptionSwagger(object, name)
harvestName := strings.Join([]string{object, display}, "_")
if m == "float" {
Expand Down Expand Up @@ -341,6 +352,9 @@ func processZAPIPerfCounters(path string, client *zapi.Client) map[string]Counte
}
harvestName := strings.Join([]string{object, display}, "_")
if m == "float" {
if _, ok := excludeCounters[name]; ok {
continue
}
if zapiTypeMap[name] != "string" {
co := Counter{
Name: harvestName,
Expand Down Expand Up @@ -393,6 +407,9 @@ func processZapiConfigCounters(path string) map[string]Counter {
}

for k, v := range zc {
if _, ok := excludeCounters[k]; ok {
continue
}
co := Counter{
Name: k,
APIs: []MetricDef{
Expand Down Expand Up @@ -596,6 +613,10 @@ func processRestPerfCounters(path string, client *rest.Client) map[string]Counte
return true
}
ontapCounterName := r.Get("name").String()
if _, ok := excludeCounters[ontapCounterName]; ok {
return true
}

description := r.Get("description").String()
ty := r.Get("type").String()
if override != nil {
Expand Down
58 changes: 58 additions & 0 deletions cmd/tools/generate/counter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,26 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_collector_calc_time
Description: amount of time it took to compute metrics between two successive polls, specifically using properties like raw, delta, rate, average, and percent. This metric is available for ZapiPerf/RestPerf collectors.
APIs:
- API: REST
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_collector_instances
Description: number of objects collected from monitored cluster
Expand All @@ -260,10 +276,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar

- Name: metadata_collector_metrics
Description: number of counters collected from monitored cluster
Expand All @@ -272,10 +290,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar

- Name: metadata_collector_parse_time
Description: amount of time to parse XML, JSON, etc. for cluster object
Expand All @@ -284,10 +304,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_collector_plugin_time
Description: amount of time for all plugins to post-process metrics
Expand All @@ -296,10 +318,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_collector_poll_time
Description: amount of time it took for the poll to finish
Expand All @@ -308,10 +332,26 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_collector_skips
Description: number of metrics that were not calculated between two successive polls. This metric is available for ZapiPerf/RestPerf collectors.
APIs:
- API: REST
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar

- Name: metadata_collector_task_time
Description: amount of time it took for each collector's subtasks to complete
Expand All @@ -320,10 +360,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_component_count
Description: number of metrics collected for each object
Expand All @@ -332,10 +374,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar

- Name: metadata_component_status
Description: status of the collector - 0 means running, 1 means standby, 2 means
Expand All @@ -345,10 +389,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: enum
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: enum

- Name: metadata_exporter_count
Description: number of metrics and labels exported
Expand All @@ -357,10 +403,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar

- Name: metadata_exporter_time
Description: amount of time it took to render, export, and serve exported data
Expand All @@ -369,10 +417,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: microseconds

- Name: metadata_target_goroutines
Description: number of goroutines that exist within the poller
Expand All @@ -381,10 +431,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: scalar

- Name: metadata_target_status
Description: status of the system being monitored. 0 means reachable, 1 means unreachable
Expand All @@ -393,10 +445,12 @@ counters:
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: enum
- API: ZAPI
Endpoint: NA
ONTAPCounter: Harvest generated
Template: NA
Unit: enum

- Name: node_cpu_busytime
Description: The time (in hundredths of a second) that the CPU has been doing useful
Expand All @@ -414,10 +468,12 @@ counters:
Endpoint: api/cluster/counter/tables/qos_detail
ONTAPCounter: Harvest generated
Template: conf/restperf/9.12.0/workload_detail.yaml
Unit: microseconds
- API: ZAPI
Endpoint: perf-object-get-instances workload_detail
ONTAPCounter: Harvest generated
Template: conf/zapiperf/9.12.0/workload_detail.yaml
Unit: microseconds

- Name: qos_detail_volume_resource_latency
Description: average latency for volume on Data ONTAP subsystems
Expand All @@ -426,10 +482,12 @@ counters:
Endpoint: api/cluster/counter/tables/qos_detail_volume
ONTAPCounter: Harvest generated
Template: conf/restperf/9.12.0/workload_detail_volume.yaml
Unit: microseconds
- API: ZAPI
Endpoint: perf-object-get-instances workload_detail_volume
ONTAPCounter: Harvest generated
Template: conf/zapiperf/9.12.0/workload_detail_volume.yaml
Unit: microseconds

- Name: quota_disk_limit
Description: Maximum amount of disk space, in kilobytes, allowed for the quota target
Expand Down
Loading

0 comments on commit 34be25d

Please sign in to comment.