Best K6 code snippet using core.getMetricCount
engine_test.go
Source:engine_test.go  
...432		}433	}434	return435}436func getMetricCount(collector *dummy.Collector, name string) (result uint) {437	for _, sc := range collector.SampleContainers {438		for _, s := range sc.GetSamples() {439			if s.Metric.Name == name {440				result++441			}442		}443	}444	return445}446const expectedHeaderMaxLength = 500447func TestSentReceivedMetrics(t *testing.T) {448	t.Parallel()449	tb := testutils.NewHTTPMultiBin(t)450	defer tb.Cleanup()451	tr := tb.Replacer.Replace452	type testScript struct {453		Code                 string454		NumRequests          int64455		ExpectedDataSent     int64456		ExpectedDataReceived int64457	}458	testScripts := []testScript{459		{tr(`import http from "k6/http";460			export default function() {461				http.get("HTTPBIN_URL/bytes/15000");462			}`), 1, 0, 15000},463		{tr(`import http from "k6/http";464			export default function() {465				http.get("HTTPBIN_URL/bytes/5000");466				http.get("HTTPSBIN_URL/bytes/5000");467				http.batch(["HTTPBIN_URL/bytes/10000", "HTTPBIN_URL/bytes/20000", "HTTPSBIN_URL/bytes/10000"]);468			}`), 5, 0, 50000},469		{tr(`import http from "k6/http";470			let data = "0123456789".repeat(100);471			export default function() {472				http.post("HTTPBIN_URL/ip", {473					file: http.file(data, "test.txt")474				});475			}`), 1, 1000, 100},476		{tr(`import ws from "k6/ws";477			let data = "0123456789".repeat(100);478			export default function() {479				ws.connect("ws://HTTPBIN_IP:HTTPBIN_PORT/ws-echo", null, function (socket) {480					socket.on('open', function open() {481						socket.send(data);482					});483					socket.on('message', function (message) {484						socket.close();485					});486				});487			}`), 2, 1000, 1000},488	}489	type testCase struct{ Iterations, VUs int64 }490	testCases := []testCase{491		{1, 1}, {1, 2}, {2, 1}, {5, 2}, {25, 2}, {50, 5},492	}493	runTest := func(t *testing.T, ts testScript, tc testCase, noConnReuse bool) (float64, float64) {494		r, err := js.New(495			&lib.SourceData{Filename: "/script.js", Data: []byte(ts.Code)},496			afero.NewMemMapFs(),497			lib.RuntimeOptions{},498		)499		require.NoError(t, err)500		options := lib.Options{501			Iterations:            null.IntFrom(tc.Iterations),502			VUs:                   null.IntFrom(tc.VUs),503			VUsMax:                null.IntFrom(tc.VUs),504			Hosts:                 tb.Dialer.Hosts,505			InsecureSkipTLSVerify: null.BoolFrom(true),506			NoVUConnectionReuse:   null.BoolFrom(noConnReuse),507		}508		r.SetOptions(options)509		engine, err := NewEngine(local.New(r), options)510		require.NoError(t, err)511		collector := &dummy.Collector{}512		engine.Collectors = []lib.Collector{collector}513		ctx, cancel := context.WithCancel(context.Background())514		errC := make(chan error)515		go func() { errC <- engine.Run(ctx) }()516		select {517		case <-time.After(10 * time.Second):518			cancel()519			t.Fatal("Test timed out")520		case err := <-errC:521			cancel()522			require.NoError(t, err)523		}524		checkData := func(name string, expected int64) float64 {525			data := getMetricSum(collector, name)526			expectedDataMin := float64(expected * tc.Iterations)527			expectedDataMax := float64((expected + ts.NumRequests*expectedHeaderMaxLength) * tc.Iterations)528			if data < expectedDataMin || data > expectedDataMax {529				t.Errorf(530					"The %s sum should be in the interval [%f, %f] but was %f",531					name, expectedDataMin, expectedDataMax, data,532				)533			}534			return data535		}536		return checkData(metrics.DataSent.Name, ts.ExpectedDataSent),537			checkData(metrics.DataReceived.Name, ts.ExpectedDataReceived)538	}539	getTestCase := func(t *testing.T, ts testScript, tc testCase) func(t *testing.T) {540		return func(t *testing.T) {541			t.Parallel()542			noReuseSent, noReuseReceived := runTest(t, ts, tc, true)543			reuseSent, reuseReceived := runTest(t, ts, tc, false)544			if noReuseSent < reuseSent {545				t.Errorf("noReuseSent=%f is greater than reuseSent=%f", noReuseSent, reuseSent)546			}547			if noReuseReceived < reuseReceived {548				t.Errorf("noReuseReceived=%f is greater than reuseReceived=%f", noReuseReceived, reuseReceived)549			}550		}551	}552	// This Run will not return until the parallel subtests complete.553	t.Run("group", func(t *testing.T) {554		for tsNum, ts := range testScripts {555			for tcNum, tc := range testCases {556				t.Run(557					fmt.Sprintf("SentReceivedMetrics_script[%d]_case[%d](%d,%d)", tsNum, tcNum, tc.Iterations, tc.VUs),558					getTestCase(t, ts, tc),559				)560			}561		}562	})563}564func TestRunTags(t *testing.T) {565	t.Parallel()566	tb := testutils.NewHTTPMultiBin(t)567	defer tb.Cleanup()568	runTagsMap := map[string]string{"foo": "bar", "test": "mest", "over": "written"}569	runTags := stats.NewSampleTags(runTagsMap)570	script := []byte(tb.Replacer.Replace(`571		import http from "k6/http";572		import ws from "k6/ws";573		import { Counter } from "k6/metrics";574		import { group, check, fail } from "k6";575		let customTags =  { "over": "the rainbow" };576		let params = { "tags": customTags};577		let statusCheck = { "status is 200": (r) => r.status === 200 }578		let myCounter = new Counter("mycounter");579		export default function() {580			group("http", function() {581				check(http.get("HTTPSBIN_URL", params), statusCheck, customTags);582				check(http.get("HTTPBIN_URL/status/418", params), statusCheck, customTags);583			})584			group("websockets", function() {585				var response = ws.connect("wss://HTTPSBIN_IP:HTTPSBIN_PORT/ws-echo", params, function (socket) {586					socket.on('open', function open() {587						console.log('ws open and say hello');588						socket.send("hello");589					});590					socket.on('message', function (message) {591						console.log('ws got message ' + message);592						if (message != "hello") {593							fail("Expected to receive 'hello' but got '" + message + "' instead !");594						}595						console.log('ws closing socket...');596						socket.close();597					});598					socket.on('close', function () {599						console.log('ws close');600					});601					socket.on('error', function (e) {602						console.log('ws error: ' + e.error());603					});604				});605				console.log('connect returned');606				check(response, { "status is 101": (r) => r && r.status === 101 }, customTags);607			})608			myCounter.add(1, customTags);609		}610	`))611	r, err := js.New(612		&lib.SourceData{Filename: "/script.js", Data: script},613		afero.NewMemMapFs(),614		lib.RuntimeOptions{},615	)616	require.NoError(t, err)617	options := lib.Options{618		Iterations:            null.IntFrom(3),619		VUs:                   null.IntFrom(2),620		VUsMax:                null.IntFrom(2),621		Hosts:                 tb.Dialer.Hosts,622		RunTags:               runTags,623		SystemTags:            lib.GetTagSet(lib.DefaultSystemTagList...),624		InsecureSkipTLSVerify: null.BoolFrom(true),625	}626	r.SetOptions(options)627	engine, err := NewEngine(local.New(r), options)628	require.NoError(t, err)629	collector := &dummy.Collector{}630	engine.Collectors = []lib.Collector{collector}631	ctx, cancel := context.WithCancel(context.Background())632	errC := make(chan error)633	go func() { errC <- engine.Run(ctx) }()634	select {635	case <-time.After(10 * time.Second):636		cancel()637		t.Fatal("Test timed out")638	case err := <-errC:639		cancel()640		require.NoError(t, err)641	}642	systemMetrics := []*stats.Metric{643		metrics.VUs, metrics.VUsMax, metrics.Iterations, metrics.IterationDuration,644		metrics.GroupDuration, metrics.DataSent, metrics.DataReceived,645	}646	getExpectedOverVal := func(metricName string) string {647		for _, sysMetric := range systemMetrics {648			if sysMetric.Name == metricName {649				return runTagsMap["over"]650			}651		}652		return "the rainbow"653	}654	for _, s := range collector.Samples {655		for key, expVal := range runTagsMap {656			val, ok := s.Tags.Get(key)657			if key == "over" {658				expVal = getExpectedOverVal(s.Metric.Name)659			}660			assert.True(t, ok)661			assert.Equalf(t, expVal, val, "Wrong tag value in sample for metric %#v", s.Metric)662		}663	}664}665func TestSetupTeardownThresholds(t *testing.T) {666	t.Parallel()667	tb := testutils.NewHTTPMultiBin(t)668	defer tb.Cleanup()669	script := []byte(tb.Replacer.Replace(`670		import http from "k6/http";671		import { check } from "k6";672		import { Counter } from "k6/metrics";673		let statusCheck = { "status is 200": (r) => r.status === 200 }674		let myCounter = new Counter("setup_teardown");675		export let options = {676			iterations: 5,677			thresholds: {678				"setup_teardown": ["count == 2"],679				"iterations": ["count == 5"],680				"http_reqs": ["count == 7"],681			},682		};683		export function setup() {684			check(http.get("HTTPBIN_IP_URL"), statusCheck) && myCounter.add(1);685		};686		export default function () {687			check(http.get("HTTPBIN_IP_URL"), statusCheck);688		};689		export function teardown() {690			check(http.get("HTTPBIN_IP_URL"), statusCheck) && myCounter.add(1);691		};692	`))693	runner, err := js.New(694		&lib.SourceData{Filename: "/script.js", Data: script},695		afero.NewMemMapFs(),696		lib.RuntimeOptions{},697	)698	require.NoError(t, err)699	runner.SetOptions(runner.GetOptions().Apply(lib.Options{700		SystemTags:      lib.GetTagSet(lib.DefaultSystemTagList...),701		SetupTimeout:    types.NullDurationFrom(3 * time.Second),702		TeardownTimeout: types.NullDurationFrom(3 * time.Second),703		VUs:             null.IntFrom(3),704		VUsMax:          null.IntFrom(3),705	}))706	engine, err := NewEngine(local.New(runner), runner.GetOptions())707	require.NoError(t, err)708	ctx, cancel := context.WithCancel(context.Background())709	errC := make(chan error)710	go func() { errC <- engine.Run(ctx) }()711	select {712	case <-time.After(10 * time.Second):713		cancel()714		t.Fatal("Test timed out")715	case err := <-errC:716		cancel()717		require.NoError(t, err)718		require.False(t, engine.IsTainted())719	}720}721func TestEmittedMetricsWhenScalingDown(t *testing.T) {722	t.Parallel()723	tb := testutils.NewHTTPMultiBin(t)724	defer tb.Cleanup()725	script := []byte(tb.Replacer.Replace(`726		import http from "k6/http";727		import { sleep } from "k6";728		export let options = {729			systemTags: ["iter", "vu", "url"],730			// Start with 2 VUs for 4 seconds and then quickly scale down to 1 for the next 4s and then quit731			vus: 2,732			vusMax: 2,733			stages: [734				{ duration: "4s", target: 2 },735				{ duration: "1s", target: 1 },736				{ duration: "3s", target: 1 },737			],738		};739		export default function () {740			console.log("VU " + __VU + " starting iteration #" + __ITER);741			http.get("HTTPBIN_IP_URL/bytes/15000");742			sleep(3.1);743			http.get("HTTPBIN_IP_URL/bytes/15000");744			console.log("VU " + __VU + " ending iteration #" + __ITER);745		};746	`))747	runner, err := js.New(748		&lib.SourceData{Filename: "/script.js", Data: script},749		afero.NewMemMapFs(),750		lib.RuntimeOptions{},751	)752	require.NoError(t, err)753	engine, err := NewEngine(local.New(runner), runner.GetOptions())754	require.NoError(t, err)755	collector := &dummy.Collector{}756	engine.Collectors = []lib.Collector{collector}757	ctx, cancel := context.WithCancel(context.Background())758	errC := make(chan error)759	go func() { errC <- engine.Run(ctx) }()760	select {761	case <-time.After(10 * time.Second):762		cancel()763		t.Fatal("Test timed out")764	case err := <-errC:765		cancel()766		require.NoError(t, err)767		require.False(t, engine.IsTainted())768	}769	// The 1.7 sleep in the default function would cause the first VU to comlete 2 full iterations770	// and stat executing its third one, while the second VU will only fully complete 1 iteration771	// and will be canceled in the middle of its second one.772	assert.Equal(t, 3.0, getMetricSum(collector, metrics.Iterations.Name))773	// That means that we expect to see 8 HTTP requests in total, 3*2=6 from the complete iterations774	// and one each from the two iterations that would be canceled in the middle of their execution775	assert.Equal(t, 8.0, getMetricSum(collector, metrics.HTTPReqs.Name))776	// But we expect to only see the data_received for only 7 of those requests. The data for the 8th777	// request (the 3rd one in the first VU before the test ends) gets cut off by the engine because778	// it's emitted after the test officially ends779	dataReceivedExpectedMin := 15000.0 * 7780	dataReceivedExpectedMax := (15000.0 + expectedHeaderMaxLength) * 7781	dataReceivedActual := getMetricSum(collector, metrics.DataReceived.Name)782	if dataReceivedActual < dataReceivedExpectedMin || dataReceivedActual > dataReceivedExpectedMax {783		t.Errorf(784			"The data_received sum should be in the interval [%f, %f] but was %f",785			dataReceivedExpectedMin, dataReceivedExpectedMax, dataReceivedActual,786		)787	}788	// Also, the interrupted iterations shouldn't affect the average iteration_duration in any way, only789	// complete iterations should be taken into account790	durationCount := float64(getMetricCount(collector, metrics.IterationDuration.Name))791	assert.Equal(t, 3.0, durationCount)792	durationSum := getMetricSum(collector, metrics.IterationDuration.Name)793	assert.InDelta(t, 3.35, durationSum/(1000*durationCount), 0.25)794}795func TestMinIterationDuration(t *testing.T) {796	t.Parallel()797	runner, err := js.New(798		&lib.SourceData{Filename: "/script.js", Data: []byte(`799		import { Counter } from "k6/metrics";800		let testCounter = new Counter("testcounter");801		export let options = {802			minIterationDuration: "1s",803			vus: 2,804			vusMax: 2,...metrics.go
Source:metrics.go  
...28}29// WithMetricCount is an option to get the histogram/summary count as metric value.30func WithMetricCount() MetricsOption {31	return func(o *metricsOptions) {32		o.getValue = getMetricCount33	}34}35// WithLabelMatchers is an option to filter only matching series.36func WithLabelMatchers(matchers ...*matchers.Matcher) MetricsOption {37	return func(o *metricsOptions) {38		o.labelMatchers = matchers39	}40}41// WaitMissingMetrics is an option to wait whenever an expected metric is missing. If this42// option is not enabled, will return error on missing metrics.43func WaitMissingMetrics() MetricsOption {44	return func(o *metricsOptions) {45		o.waitMissingMetrics = true46	}47}48// SkipMissingMetrics is an option to skip/ignore whenever an expected metric is missing.49func SkipMissingMetrics() MetricsOption {50	return func(o *metricsOptions) {51		o.skipMissingMetrics = true52	}53}54func buildMetricsOptions(opts []MetricsOption) metricsOptions {55	result := metricsOptions{56		getValue: getMetricValue,57		waitBackoff: &backoff.Config{58			Min:        300 * time.Millisecond,59			Max:        600 * time.Millisecond,60			MaxRetries: 50,61		},62	}63	for _, opt := range opts {64		opt(&result)65	}66	return result67}68func getMetricValue(m *io_prometheus_client.Metric) float64 {69	if m.GetGauge() != nil {70		return m.GetGauge().GetValue()71	} else if m.GetCounter() != nil {72		return m.GetCounter().GetValue()73	} else if m.GetHistogram() != nil {74		return m.GetHistogram().GetSampleSum()75	} else if m.GetSummary() != nil {76		return m.GetSummary().GetSampleSum()77	} else {78		return 079	}80}81func getMetricCount(m *io_prometheus_client.Metric) float64 {82	if m.GetHistogram() != nil {83		return float64(m.GetHistogram().GetSampleCount())84	} else if m.GetSummary() != nil {85		return float64(m.GetSummary().GetSampleCount())86	} else {87		return 088	}89}90func getValues(metrics []*io_prometheus_client.Metric, opts metricsOptions) []float64 {91	values := make([]float64, 0, len(metrics))92	for _, m := range metrics {93		values = append(values, opts.getValue(m))94	}95	return values...engine.go
Source:engine.go  
1package aggregator2import (3	"os"4	"github.com/rs/zerolog"5)6var logger zerolog.Logger = zerolog.New(os.Stderr).With().7	Str("source", "ENG").8	Timestamp().9	Logger()10// Engine is the core calculcation engine for counting11type Engine struct {12	Nsm *NamespaceManager13}14// NewEngine creates a new engine15func NewEngine(nsm *NamespaceManager) Engine {16	e := Engine{Nsm: nsm}17	return e18}19// HandleRawEvent is the handler for any event. It checks whether the event is defined in config20// and updates the relevant metrics21func (e Engine) HandleRawEvent(rawEvent map[string]interface{}, namespace string) error {22	// Event must have an id to identify what event it is23	id, idExists := rawEvent["id"]24	if !idExists {25		return &InvalidEventIDError{}26	}27	// Id must be an int28	idTyped, isInt := id.(int)29	if !isInt {30		return &InvalidEventIDError{}31	}32	// Get the config for the event33	// TODO Add RW lock for events34	eventConfig, configExists := e.Nsm.EventConfigsByNamespace[namespace][idTyped]35	if !configExists {36		return &EventConfigNotFoundError{}37	}38	// Validate against the config39	event, err := eventConfig.validate(rawEvent)40	if err != nil {41		return err42	}43	// Check namespace44	e.Nsm.NsDataLck.RLock()45	defer e.Nsm.NsDataLck.RUnlock()46	if _, nsExists := e.Nsm.ActiveNamespaces[namespace]; !nsExists {47		return &NamespaceNotFoundError{}48	}49	res := e.handleEvent(*event, namespace)50	return res51}52func (e Engine) handleEvent(event event, namespace string) error {53	e.Nsm.namespaceRLock(namespace)54	defer e.Nsm.namespaceRUnlock(namespace)55	// Get the metric configs for this event56	metricConfigs := e.getMetricConfigs(event, namespace)57	if len(metricConfigs) == 0 {58		return &NoMetricsFoundError{}59	}60	// Handle this event for each of these metric configs61	for _, metricConfig := range metricConfigs {62		_, isNew := metricConfig.handleEvent(event, namespace)63		if isNew {64			e.Nsm.IncrementNumKeys(namespace, metricConfig.ID)65		}66	}67	return nil68}69func (e Engine) getMetricConfigs(event event, namespace string) []*metricConfig {70	configs := []*metricConfig{}71	e.Nsm.NsDataLck.RLock()72	// Get all configs in the specified namespace73	// Check if namespace active on this node74	if _, exists := e.Nsm.ActiveNamespaces[namespace]; exists {75		specificNamespace, namespaceExists := e.Nsm.EventToMetricMap[namespace]76		if namespaceExists {77			namespaceConfigs, namespaceConfigsExist := specificNamespace[event.ID]78			if namespaceConfigsExist {79				configs = append(configs, namespaceConfigs...)80			}81		}82	}83	e.Nsm.NsDataLck.RUnlock()84	return configs85}86// GetMetricCount gets the value for a given metric87func (e Engine) GetMetricCount(ns string, metricKey int, metricID int) MetricCountResult {88	mcs, namespaceExists := e.Nsm.MetricConfigsByNamespace[ns]89	if !namespaceExists {90		return MetricCountResult{91			Err:   &NamespaceNotFoundError{},92			Count: 0,93		}94	}95	mc, mcExists := mcs[metricID]96	if !mcExists {97		return MetricCountResult{98			Err:   &MetricConfigNotFoundError{},99			Count: 0,100		}101	}102	return mc.getCount(metricKey, ns)103}...getMetricCount
Using AI Code Generation
1import (2func main() {3    urlClient := local.New(coredataUrl)4    coredataClient := coredata.NewCoreDataClient(5        types.EndpointParams{6        },7    count, err := coredataClient.EventCountForDeviceName(deviceName)8    if err != nil {9        fmt.Println(err)10    } else {11        fmt.Println("Count of metrics for device", deviceName, "is", count)12    }13}getMetricCount
Using AI Code Generation
1import (2func main() {3	metric.Fields = common.MapStr{4		"cluster_uuid": common.MapStr{5		},6		"status": common.MapStr{7		},8		"indices": common.MapStr{9			"count": common.MapStr{10			},11		},12		"nodes": common.MapStr{13			"count": common.MapStr{14			},15		},16	}17	fmt.Println(metric.getMetricCount())18}getMetricCount
Using AI Code Generation
1import (2func main() {3	core := metricdef.NewCore()4	metricDef := metricdef.New("test", 1, 1, "avg")5	core.Add(metricDef)6	count := core.GetMetricCount()7	fmt.Println("Metric Count: ", count)8	core.Remove(metricDef)9	count = core.GetMetricCount()10	fmt.Println("Metric Count: ", count)11}getMetricCount
Using AI Code Generation
1import (2func main() {3	fmt.Println(metrics.GetMetricCount())4}5import (6func main() {7	fmt.Println(metrics.GetMetricCount())8	metrics.ResetMetricCount()9	fmt.Println(metrics.GetMetricCount())10	metrics.ResetMetricCount(10)11	fmt.Println(metrics.GetMetricCount())12}13import (14func main() {15	fmt.Println(metrics.GetMetricCount())16}17import (18func main() {19	fmt.Println(metrics.GetMetricCount())20}getMetricCount
Using AI Code Generation
1import (2func main() {3	var getMetricCountMethodSignature = "func() int"4	getMetricCountMethodPtr = GetMethodPtr(coreClass, getMetricCountMethod, getMetricCountMethodSignature)5	var getMetricCountMethodFunc = *(*func() int)(unsafe.Pointer(getMetricCountMethodPtr))6	metricCount = getMetricCountMethodFunc()7	fmt.Println(metricCount)8}9func GetMethodPtr(class string, method string, methodSignature string) uintptr {10	var classType = reflect.TypeOf(class)11	var methodValue = classType.MethodByName(method)12	var methodSignatureType = reflect.TypeOf(methodSignature)13	if methodType.String() == methodSignatureType.String() {14		var methodPtr = methodValue.Func.Pointer()15	}16}17import (18func main() {19	var getMetricCountMethodSignature = "func() int"20	getMetricCountMethodPtr = GetMethodPtr(coreClass, getMetricCountMethod, getMetricCountMethodSignature)21	var getMetricCountMethodFunc = *(*func() int)(getMetricCount
Using AI Code Generation
1import (2func main() {3	core := core.NewCore()4	metricCount := core.GetMetricCount()5	fmt.Println(metricCount)6}7import (8func main() {9	core := core.NewCore()10	metricCount := core.GetMetricCount()11	fmt.Println(metricCount)12}13import (14func main() {15	core := core.NewCore()16	metricCount := core.GetMetricCount()17	fmt.Println(metricCount)18}19import (20func main() {21	core := core.NewCore()22	metricCount := core.GetMetricCount()23	fmt.Println(metricCount)24}25import (26func main() {27	core := core.NewCore()28	metricCount := core.GetMetricCount()29	fmt.Println(metricCount)30}31import (32func main() {33	core := core.NewCore()Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
