@@ -166,19 +166,38 @@ func (c *CollectConfig) GetMetricByDs(ctx context.Context, logger log.Logger, ds
166166 }
167167}
168168func (c * CollectConfig ) GetMetric (logger log.Logger , data []byte , rcs RelabelConfigs , metrics chan <- MetricGenerator ) {
169+ var err error
169170 for _ , mc := range c .Metrics {
171+ var dps []Datapoint
170172 rcs = append (rcs , mc .RelabelConfigs ... )
171173 metricLogger := log .With (logger , "metric" , mc .Name )
172174 level .Debug (metricLogger ).Log ("title" , "Raw Data" , "data_format" , c .DataFormat , "data" , string (wrapper .Limit [byte ](data , 256 , wrapper .PosCenter , []byte (" ... " )... )))
173175 switch c .DataFormat .ToLower () {
174176 case Regex :
175- mc .GetMetricByRegex (metricLogger , data , rcs , metrics )
177+ dps = mc .GetDatapointsByRegex (metricLogger , data )
176178 case Json :
177- mc .GetMetricByJson (metricLogger , data , rcs , metrics )
179+ dps = mc .GetDatapointsByJson (metricLogger , data )
178180 case Xml :
179- mc .GetMetricByXml (metricLogger , data , rcs , metrics )
181+ dps = mc .GetDatapointsByXml (metricLogger , data )
180182 case Yaml :
181- mc .GetMetricByYaml (metricLogger , data , rcs , metrics )
183+ dps = mc .GetDatapointsByYaml (metricLogger , data )
184+ }
185+
186+ for _ , dp := range dps {
187+ m := MetricGenerator {
188+ logger : logger ,
189+ MetricType : mc .MetricType ,
190+ Name : mc .Name ,
191+ Labels : Labels {Label {Name : "name" , Value : mc .Name }},
192+ }
193+ for name , val := range dp {
194+ m .Labels .Append (name , val )
195+ }
196+ m .Labels , err = mc .Relabels (logger , rcs , m .Labels )
197+ if err != nil {
198+ continue
199+ }
200+ metrics <- m
182201 }
183202 }
184203}
@@ -273,7 +292,7 @@ func (c *CollectContext) Describe(_ chan<- *prometheus.Desc) {
273292}
274293
275294func (c * CollectContext ) Collect (proMetrics chan <- prometheus.Metric ) {
276- metrics := make ( chan MetricGenerator , 10 )
295+ mgs := NewMetricGenerators ( 10 , c . logger )
277296 go func () {
278297 wg := sync.WaitGroup {}
279298 for i := range c .Datasource {
@@ -291,20 +310,43 @@ func (c *CollectContext) Collect(proMetrics chan<- prometheus.Metric) {
291310 wg .Add (1 )
292311 go func (idx int ) {
293312 defer wg .Done ()
294- c .GetMetricByDs (c .Context , c .logger , & ds , metrics )
313+ c .GetMetricByDs (c .Context , c .logger , & ds , mgs . metrics )
295314 }(i )
296315 }
297316 }
298317 wg .Wait ()
299- close (metrics )
318+ close (mgs . metrics )
300319 }()
301- for metric := range metrics {
320+ mgs .Collect (proMetrics )
321+ c .metrics .Collect (proMetrics )
322+ }
323+
324+ type MetricGenerators struct {
325+ metrics chan MetricGenerator
326+ logger log.Logger
327+ }
328+
329+ func NewMetricGenerators (size int , logger log.Logger ) * MetricGenerators {
330+ return & MetricGenerators {
331+ metrics : make (chan MetricGenerator , 10 ),
332+ logger : logger ,
333+ }
334+ }
335+
336+ func (* MetricGenerators ) Describe (_ chan <- * prometheus.Desc ) {
337+ }
338+
339+ func (mgs * MetricGenerators ) Ch () chan MetricGenerator {
340+ return mgs .metrics
341+ }
342+ func (mgs * MetricGenerators ) Collect (proMetrics chan <- prometheus.Metric ) {
343+ for metric := range mgs .metrics {
302344 if metric .Labels .Has (LabelMetricValues ) {
303- ms , errs := metric .getMetrics ()
345+ ms , errs := metric .GetMetrics ()
304346 for _ , err := range errs {
305347 if err != nil {
306348 collectErrorCount .WithLabelValues ("metric" , metric .Name ).Inc ()
307- level .Error (log .With (c .logger , "metric" , metric .Name )).Log ("log" , "failed to get prometheus metric" , "err" , err )
349+ level .Error (log .With (mgs .logger , "metric" , metric .Name )).Log ("log" , "failed to get prometheus metric" , "err" , err )
308350 }
309351 }
310352 for _ , m := range ms {
@@ -316,14 +358,12 @@ func (c *CollectContext) Collect(proMetrics chan<- prometheus.Metric) {
316358 m , err := metric .getMetric ()
317359 if err != nil {
318360 collectErrorCount .WithLabelValues ("metric" , metric .Name ).Inc ()
319- level .Error (log .With (c .logger , "metric" , metric .Name )).Log ("log" , "failed to get prometheus metric" , "err" , err )
361+ level .Error (log .With (mgs .logger , "metric" , metric .Name )).Log ("log" , "failed to get prometheus metric" , "err" , err )
320362 } else {
321363 proMetrics <- m
322364 }
323365 }
324-
325366 }
326- c .metrics .Collect (proMetrics )
327367}
328368
329369type Collects []CollectConfig
0 commit comments