func createEvent(m plugin.MetricType, config map[string]ctypes.ConfigValue) *raidman.Event { return &raidman.Event{ Host: m.Tags()[core.STD_TAG_PLUGIN_RUNNING_ON], Service: m.Namespace().String(), Metric: m.Data(), } }
func checkValues(metric plugin.MetricType, mockData []uint64) bool { result := false // get last namespace's item last := len(metric.Namespace()) - 1 // approximation error, acceptance boundary is (+/-) 0.5 approxErr := 0.5 switch metric.Namespace().Strings()[last] { case nLoggedUsers: // take the last set mock data if metric.Data() == mockData[len(mockData)-1] { result = true } case nLoggedUsersMin: if metric.Data() == min(mockData) { result = true } case nLoggedUsersMax: if metric.Data() == max(mockData) { result = true } case nLoggedUsersAvg: if math.Abs(metric.Data().(float64)-avg(mockData)) <= approxErr { result = true } } return result }
func sendEvent(orgId int64, m *plugin.MetricType) { ns := m.Namespace().Strings() if len(ns) != 4 { log.Printf("Error: invalid event metric. Expected namesapce to be 4 fields.") return } if ns[0] != "worldping" || ns[1] != "event" { log.Printf("Error: invalid event metrics. Metrics hould begin with 'worldping.event'") return } hostname, _ := os.Hostname() id := time.Now().UnixNano() event := &schema.ProbeEvent{ OrgId: orgId, EventType: ns[2], Severity: ns[3], Source: hostname, Timestamp: id / int64(time.Millisecond), Message: m.Data().(string), Tags: m.Tags(), } body, err := msg.CreateProbeEventMsg(event, id, msg.FormatProbeEventMsgp) if err != nil { log.Printf("Error: unable to convert event to ProbeEventMsgp. %s", err) return } sent := false for !sent { if err = PostData("events", Token, body); err != nil { log.Printf("Error: %s", err) time.Sleep(time.Second) } else { sent = true } } }
func (p *movingAverageProcessor) calculateMovingAverage(m plugin.MetricType, logger *log.Logger) (float64, error) { namespace := concatNameSpace(m.Namespace().Strings()) switch v := m.Data().(type) { default: logger.Warnln(fmt.Sprintf("Unknown data received: Type %T", v)) return 0.0, nil case int: if _, ok := p.movingAverageMap[namespace]; ok { counter, err := p.getCounter(namespace) counterCurrent := counter % p.movingBufLength err = p.addBufferData(counterCurrent, m.Data(), namespace) if err != nil { return 0.0, err } sum := int(0) //Initial Counter is used to give correct average for initial iterations ie when the buffer is not full initialCounter := 0 for i := 0; i < p.movingBufLength; i++ { if p.getBufferData(i, namespace) != nil { initialCounter++ sum += p.getBufferData(i, namespace).(int) } } movingAvg := float64(sum) / float64(initialCounter) counterCurrent++ p.setCounter(namespace, counterCurrent) return movingAvg, err } else { //Since map doesnot have an entry of this namespace, it's creating an entry for the namespace. //Also m.data value is inserted into 0th position of the buffer because we know that this buffer is being used for the first time p.movingAverageMap[namespace] = newmovingAverage(p.getBufferLength()) err := p.addBufferData(0, m.Data(), namespace) if err != nil { return 0.0, err } sum := p.getBufferData(0, namespace).(int) p.setCounter(namespace, 1) return float64(sum), nil } case float64: if _, ok := p.movingAverageMap[namespace]; ok { counter, err := p.getCounter(namespace) counterCurrent := counter % p.movingBufLength err = p.addBufferData(counterCurrent, m.Data(), namespace) if err != nil { return 0.0, err } sum := float64(0) initialCounter := 0 for i := 0; i < p.movingBufLength; i++ { if p.getBufferData(i, namespace) != nil { initialCounter++ sum += p.getBufferData(i, namespace).(float64) } } movingAvg := float64(sum) / float64(initialCounter) counterCurrent++ p.setCounter(namespace, counterCurrent) return movingAvg, err } p.movingAverageMap[namespace] = newmovingAverage(p.getBufferLength()) err := p.addBufferData(0, m.Data(), namespace) if err != nil { return 0.0, err } sum := p.getBufferData(0, namespace).(float64) p.setCounter(namespace, 1) return float64(sum), nil case float32: if _, ok := p.movingAverageMap[namespace]; ok { counter, err := p.getCounter(namespace) counterCurrent := counter % p.movingBufLength err = p.addBufferData(counterCurrent, m.Data(), namespace) if err != nil { return 0.0, err } sum := float32(0) initialCounter := 0 for i := 0; i < p.movingBufLength; i++ { if p.getBufferData(i, namespace) != nil { initialCounter++ sum += p.getBufferData(i, namespace).(float32) } } movingAvg := float64(sum) / float64(initialCounter) p.setCounter(namespace, counterCurrent) return movingAvg, err } p.movingAverageMap[namespace] = newmovingAverage(p.getBufferLength()) err := p.addBufferData(0, m.Data(), namespace) if err != nil { return 0.0, err } sum := p.getBufferData(0, namespace).(float32) p.setCounter(namespace, 1) return float64(sum), nil case uint32: if _, ok := p.movingAverageMap[namespace]; ok { counter, err := p.getCounter(namespace) counterCurrent := counter % p.movingBufLength err = p.addBufferData(counterCurrent, m.Data(), namespace) if err != nil { return 0.0, err } sum := uint32(0) initialCounter := 0 for i := 0; i < p.movingBufLength; i++ { if p.getBufferData(i, namespace) != nil { initialCounter++ sum += p.getBufferData(i, namespace).(uint32) } } movingAvg := float64(sum) / float64(initialCounter) counterCurrent++ p.setCounter(namespace, counterCurrent) return movingAvg, err } p.movingAverageMap[namespace] = newmovingAverage(p.getBufferLength()) err := p.addBufferData(0, m.Data(), namespace) if err != nil { return 0.0, err } sum := p.getBufferData(0, namespace).(uint32) p.setCounter(namespace, 1) return float64(sum), nil case uint64: if _, ok := p.movingAverageMap[namespace]; ok { counter, err := p.getCounter(namespace) counterCurrent := counter % p.movingBufLength err = p.addBufferData(counterCurrent, m.Data(), namespace) if err != nil { return 0.0, err } sum := uint64(0) initialCounter := 0 for i := 0; i < p.movingBufLength; i++ { if p.getBufferData(i, namespace) != nil { initialCounter++ sum += p.getBufferData(i, namespace).(uint64) } } movingAvg := float64(sum) / float64(initialCounter) counterCurrent++ p.setCounter(namespace, counterCurrent) return movingAvg, err } p.movingAverageMap[namespace] = newmovingAverage(p.getBufferLength()) err := p.addBufferData(0, m.Data(), namespace) if err != nil { return 0.0, err } sum := p.getBufferData(0, namespace).(uint64) p.setCounter(namespace, 1) return float64(sum), nil } }
// function which fills all part of Heka message func setHekaMessageFields(m plugin.MetricType, msg *message.Message) error { mName := make([]string, 0, len(m.Namespace())) var dimField *message.Field var err error // Loop on namespace elements for _, elt := range m.Namespace() { logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Namespace %#+v", elt)) // Dynamic element is not inserted in metric name // but rather added to dimension field if elt.IsDynamic() { dimField, err = addToDimensions(dimField, elt.Name) if err != nil { logger.WithField("_block", "setHekaMessageFields").Error(err) return err } addField(elt.Name, elt.Value, msg) } else { // Static element is concatenated to metric name mName = append(mName, elt.Value) } } // Processing of tags if len(m.Tags()) > 0 { for tag, value := range m.Tags() { logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Adding tag=%s value=%s", tag, value)) dimField, err = addToDimensions(dimField, tag) if err != nil { logger.WithField("_block", "setHekaMessageFields").Error(err) return err } addField(tag, value, msg) } } if dimField != nil { msg.AddField(dimField) } // Handle metric name metricName := strings.Join(mName, ".") // TODO protect access using mutex // for potential race conditions logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Checking metric=%s", metricName)) // Is mapping already stored if val, ok := MetricMappings[metricName]; ok { logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Metric=%s in cache %s", metricName, val)) metricName = val } else { oldMetricName := metricName logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Metric=%s not in cache", metricName)) // Namespace handling for kmapping, vmapping := range globalMappings.Namespace { logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Checking metric=%s against namespace %s (%s)", metricName, kmapping, vmapping)) // Try to see if substitution changes something newMetricName := strings.Replace(metricName, kmapping, vmapping, 1) if strings.Compare(newMetricName, metricName) != 0 { MetricMappings[oldMetricName] = newMetricName logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Changing metric=%s into %s", metricName, newMetricName)) metricName = newMetricName } } // Metrics handling for kmapping, vmapping := range globalMappings.Metrics { logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Checking metric=%s against metric %s (%s)", metricName, kmapping, vmapping)) // Try to see if substitution changes something newMetricName := strings.Replace(metricName, kmapping, vmapping, 1) if strings.Compare(newMetricName, metricName) != 0 { MetricMappings[oldMetricName] = newMetricName logger.WithField("_block", "setHekaMessageFields").Debug( fmt.Sprintf("Changing metric=%s into %s", metricName, newMetricName)) metricName = newMetricName } } } addField("name", metricName, msg) addField("value", getData(m.Data()), msg) addField("timestamp", m.Timestamp().UnixNano(), msg) return nil }