github.com/netdata/go.d.plugin@v0.58.1/modules/pulsar/collect.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package pulsar 4 5 import ( 6 "errors" 7 "strings" 8 9 "github.com/netdata/go.d.plugin/pkg/prometheus" 10 "github.com/netdata/go.d.plugin/pkg/stm" 11 ) 12 13 func isValidPulsarMetrics(pms prometheus.Series) bool { 14 return pms.FindByName(metricPulsarTopicsCount).Len() > 0 15 } 16 17 func (p *Pulsar) resetCurCache() { 18 for ns := range p.curCache.namespaces { 19 delete(p.curCache.namespaces, ns) 20 } 21 for top := range p.curCache.topics { 22 delete(p.curCache.topics, top) 23 } 24 } 25 26 func (p *Pulsar) collect() (map[string]int64, error) { 27 pms, err := p.prom.ScrapeSeries() 28 if err != nil { 29 return nil, err 30 } 31 32 if !isValidPulsarMetrics(pms) { 33 return nil, errors.New("returned metrics aren't Apache Pulsar metrics") 34 } 35 36 p.once.Do(func() { 37 p.adjustCharts(pms) 38 }) 39 40 mx := p.collectMetrics(pms) 41 p.updateCharts() 42 p.resetCurCache() 43 44 return stm.ToMap(mx), nil 45 } 46 47 func (p *Pulsar) collectMetrics(pms prometheus.Series) map[string]float64 { 48 mx := make(map[string]float64) 49 p.collectBroker(mx, pms) 50 return mx 51 } 52 53 func (p *Pulsar) collectBroker(mx map[string]float64, pms prometheus.Series) { 54 pms = findPulsarMetrics(pms) 55 for _, pm := range pms { 56 ns, top := newNamespace(pm), newTopic(pm) 57 if ns.name == "" { 58 continue 59 } 60 61 p.curCache.namespaces[ns] = true 62 63 value := pm.Value * precision(pm.Name()) 64 mx[pm.Name()] += value 65 mx[pm.Name()+"_"+ns.name] += value 66 67 if top.name == "" || !p.topicFilter.MatchString(top.name) { 68 continue 69 } 70 71 p.curCache.topics[top] = true 72 mx[pm.Name()+"_"+top.name] += value 73 } 74 mx["pulsar_namespaces_count"] = float64(len(p.curCache.namespaces)) 75 } 76 77 func newNamespace(pm prometheus.SeriesSample) namespace { 78 return namespace{ 79 name: pm.Labels.Get("namespace"), 80 } 81 } 82 83 func newTopic(pm prometheus.SeriesSample) topic { 84 return topic{ 85 namespace: pm.Labels.Get("namespace"), 86 name: pm.Labels.Get("topic"), 87 } 88 } 89 90 func findPulsarMetrics(pms prometheus.Series) prometheus.Series { 91 var ms prometheus.Series 92 for _, pm := range pms { 93 if isPulsarHistogram(pm) { 94 ms = append(ms, pm) 95 } 96 } 97 pms = pms.FindByNames( 98 metricPulsarTopicsCount, 99 metricPulsarSubscriptionDelayed, 100 metricPulsarSubscriptionsCount, 101 metricPulsarProducersCount, 102 metricPulsarConsumersCount, 103 metricPulsarRateIn, 104 metricPulsarRateOut, 105 metricPulsarThroughputIn, 106 metricPulsarThroughputOut, 107 metricPulsarStorageSize, 108 metricPulsarStorageWriteRate, 109 metricPulsarStorageReadRate, 110 metricPulsarMsgBacklog, 111 metricPulsarSubscriptionMsgRateRedeliver, 112 metricPulsarSubscriptionBlockedOnUnackedMessages, 113 ) 114 return append(ms, pms...) 115 } 116 117 func isPulsarHistogram(pm prometheus.SeriesSample) bool { 118 s := pm.Name() 119 return strings.HasPrefix(s, "pulsar_storage_write_latency") || strings.HasPrefix(s, "pulsar_entry_size") 120 } 121 122 func precision(metric string) float64 { 123 switch metric { 124 case metricPulsarRateIn, 125 metricPulsarRateOut, 126 metricPulsarThroughputIn, 127 metricPulsarThroughputOut, 128 metricPulsarStorageWriteRate, 129 metricPulsarStorageReadRate, 130 metricPulsarSubscriptionMsgRateRedeliver, 131 metricPulsarReplicationRateIn, 132 metricPulsarReplicationRateOut, 133 metricPulsarReplicationThroughputIn, 134 metricPulsarReplicationThroughputOut: 135 return 1000 136 } 137 return 1 138 }