func (events *analyticsEvents) CollectorJSON(agentRunID string) ([]byte, error) { if 0 == events.numSeen { return nil, nil } estimate := 256 * len(events.events) buf := bytes.NewBuffer(make([]byte, 0, estimate)) buf.WriteByte('[') jsonx.AppendString(buf, agentRunID) buf.WriteByte(',') buf.WriteByte('{') buf.WriteString(`"reservoir_size":`) jsonx.AppendUint(buf, uint64(cap(events.events))) buf.WriteByte(',') buf.WriteString(`"events_seen":`) jsonx.AppendUint(buf, uint64(events.numSeen)) buf.WriteByte('}') buf.WriteByte(',') buf.WriteByte('[') for i, e := range events.events { if i > 0 { buf.WriteByte(',') } e.WriteJSON(buf) } buf.WriteByte(']') buf.WriteByte(']') return buf.Bytes(), nil }
func (w *jsonFieldsWriter) addKey(key string) { if w.needsComma { w.buf.WriteByte(',') } else { w.needsComma = true } // defensively assume that the key needs escaping: jsonx.AppendString(w.buf, key) w.buf.WriteByte(':') }
func (slow *slowQuery) WriteJSON(buf *bytes.Buffer) { buf.WriteByte('[') jsonx.AppendString(buf, slow.TxnName) buf.WriteByte(',') jsonx.AppendString(buf, slow.TxnURL) buf.WriteByte(',') jsonx.AppendInt(buf, int64(makeSlowQueryID(slow.ParameterizedQuery))) buf.WriteByte(',') jsonx.AppendString(buf, slow.ParameterizedQuery) buf.WriteByte(',') jsonx.AppendString(buf, slow.DatastoreMetric) buf.WriteByte(',') jsonx.AppendInt(buf, int64(slow.Count)) buf.WriteByte(',') jsonx.AppendFloat(buf, slow.Total.Seconds()*1000.0) buf.WriteByte(',') jsonx.AppendFloat(buf, slow.Min.Seconds()*1000.0) buf.WriteByte(',') jsonx.AppendFloat(buf, slow.Duration.Seconds()*1000.0) buf.WriteByte(',') w := jsonFieldsWriter{buf: buf} buf.WriteByte('{') if "" != slow.Host { w.stringField("host", slow.Host) } if "" != slow.PortPathOrID { w.stringField("port_path_or_id", slow.PortPathOrID) } if "" != slow.DatabaseName { w.stringField("database_name", slow.DatabaseName) } if nil != slow.StackTrace { w.writerField("backtrace", slow.StackTrace) } if nil != slow.QueryParameters { w.writerField("query_parameters", slow.QueryParameters) } buf.WriteByte('}') buf.WriteByte(']') }
func printNodeStart(buf *bytes.Buffer, n nodeDetails) { // time.Seconds() is intentionally not used here. Millisecond // precision is enough. relativeStartMillis := n.relativeStart.Nanoseconds() / (1000 * 1000) relativeStopMillis := n.relativeStop.Nanoseconds() / (1000 * 1000) buf.WriteByte('[') jsonx.AppendInt(buf, relativeStartMillis) buf.WriteByte(',') jsonx.AppendInt(buf, relativeStopMillis) buf.WriteByte(',') jsonx.AppendString(buf, n.name) buf.WriteByte(',') if nil == n.params { buf.WriteString("{}") } else { n.params.WriteJSON(buf) } buf.WriteByte(',') buf.WriteByte('[') }
func (w *jsonFieldsWriter) stringField(key string, val string) { w.addKey(key) jsonx.AppendString(w.buf, val) }