github.com/verrazzano/verrazzano@v1.7.1/tools/psr/backend/workers/opensearch/writelogs/writelogs.go (about)

     1  // Copyright (c) 2022, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package writelogs
     5  
     6  import (
     7  	"fmt"
     8  	"sync/atomic"
     9  
    10  	"github.com/prometheus/client_golang/prometheus"
    11  	"github.com/verrazzano/verrazzano/pkg/log/vzlog"
    12  	"github.com/verrazzano/verrazzano/tools/psr/backend/config"
    13  	"github.com/verrazzano/verrazzano/tools/psr/backend/metrics"
    14  	"github.com/verrazzano/verrazzano/tools/psr/backend/osenv"
    15  	"github.com/verrazzano/verrazzano/tools/psr/backend/spi"
    16  )
    17  
    18  // metricsPrefix is the prefix that is automatically pre-pended to all metrics exported by this worker.
    19  const metricsPrefix = "opensearch_writelogs"
    20  
    21  type worker struct {
    22  	metricDescList []prometheus.Desc
    23  	*workerMetrics
    24  }
    25  
    26  var _ spi.Worker = worker{}
    27  
    28  // workerMetrics holds the metrics produced by the worker. Metrics must be thread safe.
    29  type workerMetrics struct {
    30  	loggedLinesCountTotal metrics.MetricItem
    31  	loggedCharsCountTotal metrics.MetricItem
    32  }
    33  
    34  func NewWriteLogsWorker() (spi.Worker, error) {
    35  	w := worker{workerMetrics: &workerMetrics{
    36  		loggedLinesCountTotal: metrics.MetricItem{
    37  			Name: "logged_lines_count_total",
    38  			Help: "The total number of lines logged",
    39  			Type: prometheus.CounterValue,
    40  		},
    41  		loggedCharsCountTotal: metrics.MetricItem{
    42  			Name: "logged_chars_total",
    43  			Help: "The total number of characters logged",
    44  			Type: prometheus.CounterValue,
    45  		},
    46  	}}
    47  
    48  	if err := config.PsrEnv.LoadFromEnv(w.GetEnvDescList()); err != nil {
    49  		return w, err
    50  	}
    51  
    52  	metricsLabels := map[string]string{
    53  		config.PsrWorkerTypeMetricsName: config.PsrEnv.GetEnv(config.PsrWorkerType),
    54  	}
    55  
    56  	w.metricDescList = metrics.BuildMetricDescList([]*metrics.MetricItem{
    57  		&w.loggedLinesCountTotal,
    58  		&w.loggedCharsCountTotal,
    59  	}, metricsLabels, w.GetWorkerDesc().MetricsPrefix)
    60  
    61  	return w, nil
    62  }
    63  
    64  // GetWorkerDesc returns the WorkerDesc for the worker
    65  func (w worker) GetWorkerDesc() spi.WorkerDesc {
    66  	return spi.WorkerDesc{
    67  		WorkerType:    config.WorkerTypeOpsWriteLogs,
    68  		Description:   "The writelogs worker writes logs to STDOUT, putting a load on OpenSearch",
    69  		MetricsPrefix: metricsPrefix,
    70  	}
    71  }
    72  
    73  func (w worker) GetEnvDescList() []osenv.EnvVarDesc {
    74  	return []osenv.EnvVarDesc{}
    75  }
    76  
    77  func (w worker) WantLoopInfoLogged() bool {
    78  	return false
    79  }
    80  
    81  func (w worker) PreconditionsMet() (bool, error) {
    82  	return true, nil
    83  }
    84  
    85  func (w worker) DoWork(conf config.CommonConfig, log vzlog.VerrazzanoLogger) error {
    86  	lc := atomic.AddInt64(&w.workerMetrics.loggedLinesCountTotal.Val, 1)
    87  	logMsg := fmt.Sprintf("Writelogs worker logging line %v", lc)
    88  	log.Infof(logMsg)
    89  	atomic.AddInt64(&w.workerMetrics.loggedCharsCountTotal.Val, int64(len(logMsg)))
    90  	return nil
    91  }
    92  
    93  func (w worker) GetMetricDescList() []prometheus.Desc {
    94  	return w.metricDescList
    95  }
    96  
    97  func (w worker) GetMetricList() []prometheus.Metric {
    98  	return []prometheus.Metric{
    99  		w.loggedLinesCountTotal.BuildMetric(),
   100  		w.loggedCharsCountTotal.BuildMetric(),
   101  	}
   102  }