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

     1  // Copyright 2020 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  	"github.com/v2fly/tools/internal/event/keys"
    14  )
    15  
    16  func TestEncodeMetric(t *testing.T) {
    17  	exporter := registerExporter()
    18  	const prefix = testNodeStr + `
    19  	"metrics":[`
    20  	const suffix = `]}`
    21  	tests := []struct {
    22  		name string
    23  		run  func(ctx context.Context)
    24  		want string
    25  	}{
    26  		{
    27  			name: "HistogramFloat64, HistogramInt64",
    28  			run: func(ctx context.Context) {
    29  				ctx = event.Label(ctx, keyMethod.Of("godoc.ServeHTTP"))
    30  				event.Metric(ctx, latencyMs.Of(96.58))
    31  				ctx = event.Label(ctx, keys.Err.Of(errors.New("panic: fatal signal")))
    32  				event.Metric(ctx, bytesIn.Of(97e2))
    33  			},
    34  			want: prefix + `
    35  			{
    36  				"metric_descriptor": {
    37  					"name": "latency_ms",
    38  					"description": "The latency of calls in milliseconds",
    39  					"type": 6,
    40  					"label_keys": [
    41  						{
    42  							"key": "method"
    43  						},
    44  						{
    45  							"key": "route"
    46  						}
    47  					]
    48  				},
    49  				"timeseries": [
    50  					{
    51  						"start_timestamp": "1970-01-01T00:00:00Z",
    52  						"points": [
    53  							{
    54  								"timestamp": "1970-01-01T00:00:40Z",
    55  								"distributionValue": {
    56  									"count": 1,
    57  									"sum": 96.58,
    58  									"bucket_options": {
    59  										"explicit": {
    60  											"bounds": [
    61  												0,
    62  												5,
    63  												10,
    64  												25,
    65  												50
    66  											]
    67  										}
    68  									},
    69  									"buckets": [
    70  										{},
    71  										{},
    72  										{},
    73  										{},
    74  										{}
    75  									]
    76  								}
    77  							}
    78  						]
    79  					}
    80  				]
    81  			},
    82  			{
    83  				"metric_descriptor": {
    84  					"name": "latency_ms",
    85  					"description": "The latency of calls in milliseconds",
    86  					"type": 6,
    87  					"label_keys": [
    88  						{
    89  							"key": "method"
    90  						},
    91  						{
    92  							"key": "route"
    93  						}
    94  					]
    95  				},
    96  				"timeseries": [
    97  					{
    98  						"start_timestamp": "1970-01-01T00:00:00Z",
    99  						"points": [
   100  							{
   101  								"timestamp": "1970-01-01T00:00:40Z",
   102  								"distributionValue": {
   103  									"count": 1,
   104  									"sum": 9700,
   105  									"bucket_options": {
   106  										"explicit": {
   107  											"bounds": [
   108  												0,
   109  												10,
   110  												50,
   111  												100,
   112  												500,
   113  												1000,
   114  												2000
   115  											]
   116  										}
   117  									},
   118  									"buckets": [
   119  										{},
   120  										{},
   121  										{},
   122  										{},
   123  										{},
   124  										{},
   125  										{}
   126  									]
   127  								}
   128  							}
   129  						]
   130  					}
   131  				]
   132  			}` + suffix,
   133  		},
   134  	}
   135  
   136  	ctx := context.TODO()
   137  	for _, tt := range tests {
   138  		t.Run(tt.name, func(t *testing.T) {
   139  			tt.run(ctx)
   140  			got := exporter.Output("/v1/metrics")
   141  			checkJSON(t, got, []byte(tt.want))
   142  		})
   143  	}
   144  }