github.com/v2fly/tools@v0.100.0/internal/event/export/ocagent/trace_test.go (about)

     1  // Copyright 2019 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package ocagent_test
     6  
     7  import (
     8  	"context"
     9  	"errors"
    10  	"testing"
    11  
    12  	"github.com/v2fly/tools/internal/event"
    13  )
    14  
    15  func TestTrace(t *testing.T) {
    16  	exporter := registerExporter()
    17  	const prefix = testNodeStr + `
    18  	"spans":[{
    19  		"trace_id":"AAAAAAAAAAAAAAAAAAAAAA==",
    20  		"span_id":"AAAAAAAAAAA=",
    21  		"parent_span_id":"AAAAAAAAAAA=",
    22  		"name":{"value":"event span"},
    23  		"start_time":"1970-01-01T00:00:30Z",
    24  		"end_time":"1970-01-01T00:00:50Z",
    25  		"time_events":{
    26  `
    27  	const suffix = `
    28  		},
    29  		"same_process_as_parent_span":true
    30  	}]
    31  }`
    32  
    33  	tests := []struct {
    34  		name string
    35  		run  func(ctx context.Context)
    36  		want string
    37  	}{
    38  		{
    39  			name: "no labels",
    40  			run: func(ctx context.Context) {
    41  				event.Label(ctx)
    42  			},
    43  			want: prefix + `
    44  					"timeEvent":[{"time":"1970-01-01T00:00:40Z"}]
    45  		` + suffix,
    46  		},
    47  		{
    48  			name: "description no error",
    49  			run: func(ctx context.Context) {
    50  				event.Log(ctx, "cache miss", keyDB.Of("godb"))
    51  			},
    52  			want: prefix + `"timeEvent":[{"time":"1970-01-01T00:00:40Z","annotation":{
    53  "description": { "value": "cache miss" },
    54  "attributes": {
    55  	"attributeMap": {
    56  		"db": { "stringValue": { "value": "godb" } }
    57  	}
    58  }
    59  }}]` + suffix,
    60  		},
    61  
    62  		{
    63  			name: "description and error",
    64  			run: func(ctx context.Context) {
    65  				event.Error(ctx, "cache miss",
    66  					errors.New("no network connectivity"),
    67  					keyDB.Of("godb"),
    68  				)
    69  			},
    70  			want: prefix + `"timeEvent":[{"time":"1970-01-01T00:00:40Z","annotation":{
    71  "description": { "value": "cache miss" },
    72  "attributes": {
    73  	"attributeMap": {
    74  		"db": { "stringValue": { "value": "godb" } },
    75  		"error": { "stringValue": { "value": "no network connectivity" } }
    76  	}
    77  }
    78  }}]` + suffix,
    79  		},
    80  		{
    81  			name: "no description, but error",
    82  			run: func(ctx context.Context) {
    83  				event.Error(ctx, "",
    84  					errors.New("no network connectivity"),
    85  					keyDB.Of("godb"),
    86  				)
    87  			},
    88  			want: prefix + `"timeEvent":[{"time":"1970-01-01T00:00:40Z","annotation":{
    89  "description": { "value": "no network connectivity" },
    90  "attributes": {
    91  	"attributeMap": {
    92  		"db": { "stringValue": { "value": "godb" } }
    93  	}
    94  }
    95  }}]` + suffix,
    96  		},
    97  		{
    98  			name: "enumerate all attribute types",
    99  			run: func(ctx context.Context) {
   100  				event.Log(ctx, "cache miss",
   101  					key1DB.Of("godb"),
   102  
   103  					key2aAge.Of(0.456), // Constant converted into "float64"
   104  					key2bTTL.Of(float32(5000)),
   105  					key2cExpiryMS.Of(float64(1e3)),
   106  
   107  					key3aRetry.Of(false),
   108  					key3bStale.Of(true),
   109  
   110  					key4aMax.Of(0x7fff), // Constant converted into "int"
   111  					key4bOpcode.Of(int8(0x7e)),
   112  					key4cBase.Of(int16(1<<9)),
   113  					key4eChecksum.Of(int32(0x11f7e294)),
   114  					key4fMode.Of(int64(0644)),
   115  
   116  					key5aMin.Of(uint(1)),
   117  					key5bMix.Of(uint8(44)),
   118  					key5cPort.Of(uint16(55678)),
   119  					key5dMinHops.Of(uint32(1<<9)),
   120  					key5eMaxHops.Of(uint64(0xffffff)),
   121  				)
   122  			},
   123  			want: prefix + `"timeEvent":[{"time":"1970-01-01T00:00:40Z","annotation":{
   124  "description": { "value": "cache miss" },
   125  "attributes": {
   126  	"attributeMap": {
   127  		"1_db": { "stringValue": { "value": "godb" } },
   128  		"2a_age": { "doubleValue": 0.456 },
   129  		"2b_ttl": { "doubleValue": 5000 },
   130  		"2c_expiry_ms": { "doubleValue": 1000 },
   131  		"3a_retry": {},
   132  		"3b_stale": { "boolValue": true },
   133  		"4a_max": { "intValue": 32767 },
   134  		"4b_opcode": { "intValue": 126 },
   135  		"4c_base": { "intValue": 512 },
   136  		"4e_checksum": { "intValue": 301458068 },
   137  		"4f_mode": { "intValue": 420 },
   138  		"5a_min": { "intValue": 1 },
   139  		"5b_mix": { "intValue": 44 },
   140  		"5c_port": { "intValue": 55678 },
   141  		"5d_min_hops": { "intValue": 512 },
   142  		"5e_max_hops": { "intValue": 16777215 }
   143  	}
   144  }
   145  }}]` + suffix,
   146  		},
   147  	}
   148  	ctx := context.TODO()
   149  	for _, tt := range tests {
   150  		t.Run(tt.name, func(t *testing.T) {
   151  			ctx, done := event.Start(ctx, "event span")
   152  			tt.run(ctx)
   153  			done()
   154  			got := exporter.Output("/v1/trace")
   155  			checkJSON(t, got, []byte(tt.want))
   156  		})
   157  	}
   158  }