func traceDataJSON(trace *HarvestTrace) []byte { estimate := 100 * len(trace.Trace.nodes) buf := bytes.NewBuffer(make([]byte, 0, estimate)) nodes := make(sortedTraceNodes, len(trace.Trace.nodes)) for i := 0; i < len(nodes); i++ { nodes[i] = &trace.Trace.nodes[i] } sort.Sort(nodes) buf.WriteByte('[') // begin trace data // If the trace string pool is used, insert another array here. jsonx.AppendFloat(buf, 0.0) // unused timestamp buf.WriteByte(',') // buf.WriteString("{}") // unused: formerly request parameters buf.WriteByte(',') // buf.WriteString("{}") // unused: formerly custom parameters buf.WriteByte(',') // printNodeStart(buf, nodeDetails{ // begin outer root name: "ROOT", relativeStart: 0, relativeStop: trace.Duration, }) printNodeStart(buf, nodeDetails{ // begin inner root name: trace.MetricName, relativeStart: 0, relativeStop: trace.Duration, }) if len(nodes) > 0 { lastStopStamp := nodes[len(nodes)-1].stop.Stamp + 1 printChildren(buf, trace.Start, nodes, 0, lastStopStamp) } buf.WriteString("]]") // end outer root buf.WriteString("]]") // end inner root buf.WriteByte(',') buf.WriteByte('{') buf.WriteString(`"agentAttributes":`) agentAttributesJSON(trace.Attrs, buf, destTxnTrace) buf.WriteByte(',') buf.WriteString(`"userAttributes":`) userAttributesJSON(trace.Attrs, buf, destTxnTrace) buf.WriteByte(',') buf.WriteString(`"intrinsics":{}`) // TODO intrinsics buf.WriteByte('}') // If the trace string pool is used, end another array here. buf.WriteByte(']') // end trace data return buf.Bytes() }
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 (w *jsonFieldsWriter) floatField(key string, val float64) { w.addKey(key) jsonx.AppendFloat(w.buf, val) }