github.com/Axway/agent-sdk@v1.1.101/pkg/transaction/metric/metricevent.go (about)

     1  package metric
     2  
     3  import (
     4  	"encoding/json"
     5  	"time"
     6  
     7  	"github.com/Axway/agent-sdk/pkg/agent"
     8  	"github.com/Axway/agent-sdk/pkg/traceability"
     9  	"github.com/Axway/agent-sdk/pkg/traceability/sampling"
    10  	"github.com/Axway/agent-sdk/pkg/util/log"
    11  	"github.com/elastic/beats/v7/libbeat/beat"
    12  	beatPub "github.com/elastic/beats/v7/libbeat/publisher"
    13  	metrics "github.com/rcrowley/go-metrics"
    14  )
    15  
    16  // CondorMetricEvent - the condor event format to send metric data
    17  type CondorMetricEvent struct {
    18  	Message   string                 `json:"message"`
    19  	Fields    map[string]interface{} `json:"fields"`
    20  	Timestamp time.Time              `json:"-"`
    21  	ID        string                 `json:"-"`
    22  }
    23  
    24  // AddCondorMetricEventToBatch - creates the condor metric event and adds to the batch
    25  func AddCondorMetricEventToBatch(metricEvent V4Event, batch *EventBatch, histogram metrics.Histogram) error {
    26  	metricData, _ := json.Marshal(metricEvent)
    27  
    28  	cme := &CondorMetricEvent{
    29  		Message:   string(metricData),
    30  		Fields:    make(map[string]interface{}),
    31  		Timestamp: metricEvent.Data.GetStartTime(),
    32  		ID:        metricEvent.ID,
    33  	}
    34  	event, err := cme.CreateEvent()
    35  	if err != nil {
    36  		return err
    37  	}
    38  	batch.AddEvent(event, histogram)
    39  	return nil
    40  }
    41  
    42  // CreateEvent - creates the beat event to add to the batch
    43  func (c *CondorMetricEvent) CreateEvent() (beatPub.Event, error) {
    44  	// Get the event token
    45  	token, err := agent.GetCentralAuthToken()
    46  	if err != nil {
    47  		return beatPub.Event{}, err
    48  	}
    49  	c.Fields["token"] = token
    50  	c.Fields[traceability.FlowHeader] = metricFlow
    51  
    52  	// convert the CondorMetricEvent to json then to map[string]interface{}
    53  	cmeJSON, err := json.Marshal(c)
    54  	if err != nil {
    55  		return beatPub.Event{}, err
    56  	}
    57  
    58  	var fieldsData map[string]interface{}
    59  	err = json.Unmarshal(cmeJSON, &fieldsData)
    60  	if err != nil {
    61  		return beatPub.Event{}, err
    62  	}
    63  
    64  	beatEnv := beatPub.Event{
    65  		Content: beat.Event{
    66  			Timestamp: c.Timestamp,
    67  			Meta: map[string]interface{}{
    68  				metricKey:          c.ID,
    69  				sampling.SampleKey: true, // All metric events should be sent
    70  			},
    71  			Fields: fieldsData,
    72  		},
    73  		Flags: beatPub.GuaranteedSend,
    74  	}
    75  	log.Tracef("Created Metric Event: %+v", beatEnv)
    76  	return beatEnv, nil
    77  }