---
title: "Version 0.47.0 release notes | Grafana k6 documentation"
description: "The release notes for Grafana k6 version 0.47.0"
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

# Version 0.47.0 release notes

k6 `v0.47.0` is here 🎉! This release includes:

## Deprecations

- [#3347](https://github.com/grafana/k6/pull/3347) The built-in `statsd` output option has been deprecated, and users should use the [xk6-output-statsd](https://github.com/LeonAdato/xk6-output-statsd) extension instead. See [#2982](https://github.com/grafana/k6/issues/2982) for future plans.
- [#3288](https://github.com/grafana/k6/pull/3288) Loading remote modules now requires users to prepend them with `https://`. Before, k6 would try to resolve importing remote modules by prepending `https://` if it was missing. This behavior has been deprecated and will be fully removed in the next release (v0.48.0).

## New features

### Add gRPC’s binary metadata support [#3234](https://github.com/grafana/k6/pull/3234), [xk6-grpc#46](https://github.com/grafana/xk6-grpc/pull/46)

The k6 gRPC modules (`k6/net/grpc` and `k6/experimental/grpc`) now support handling binary metadata that uses the `-bin` postfix, according to the gRPC specification.

js ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```js
let resp = client.invoke(
  'grpc.testing.TestService/EmptyCall',
  {},
  { metadata: { 'X-Load-Tester-bin': new Uint8Array([2, 200]) } }
);
```

Thanks to @sapphire-janrain for the contribution!

### Add gRPC’s reflection metadata support [#3343](https://github.com/grafana/k6/pull/3343), [xk6-grpc#46](https://github.com/grafana/xk6-grpc/pull/46)

The k6 gRPC modules (`k6/net/grpc` and `k6/experimental/grpc`) now support adding metadata to reflection requests by using a new connection parameter [`reflectMetadata`](https://k6.io/docs/javascript-api/k6-net-grpc/client/client-connect/#connectparams).

### Higher precision for Trend metrics in Grafana Cloud k6 [#3302](https://github.com/grafana/k6/pull/3302)

Grafana Cloud k6 is now able to store and visualize Trend metrics up to 3 digits of precision for decimal numbers.

### Docker support for browser-based tests [#3199](https://github.com/grafana/k6/pull/3199)

k6 is now publishig Docker images that include Chromium web browser. This allows k6 users to run tests that use [Browser API](https://k6.io/docs/javascript-api/k6-experimental/browser/) without having to install Chrome first. Check the [“A note on running browser tests” section](https://hub.docker.com/r/grafana/k6) of the Overview page on DockerHub for details.

### Docker images for ARM64 architecture [#3320](https://github.com/grafana/k6/pull/3320)

The k6’s release process now builds and pushes dedicated Docker images for ARM64. Check k6’s [tags page](https://hub.docker.com/r/grafana/k6/tags) on DockerHub for details.

### New authentication methods and HTTP headers API for Prometheus remote write output [xk6-output-prometheus-remote#143](https://github.com/grafana/xk6-output-prometheus-remote/pull/143), [xk6-output-prometheus-remote#145](https://github.com/grafana/xk6-output-prometheus-remote/pull/145), [xk6-output-prometheus-remote#147](https://github.com/grafana/xk6-output-prometheus-remote/pull/147)

The experimental Prometheus remote write output now supports two new authentication methods: Bearer token and TLS certificates. Check out the [documentation](https://k6.io/docs/results-output/real-time/prometheus-remote-write/#options) to learn more about how to define them using the new environment variables. We’ve also added the `K6_PROMETHEUS_RW_HTTP_HEADERS` that defines a new and more convenient way to set custom HTTP headers to pass through each flush metrics’ request.

### Improved the browser module’s cookie API

The browser module now provides a more complete and robust API for handling cookies. The cookie API was stabilized by defining a new [`Cookie` class](https://k6.io/docs/javascript-api/k6-experimental/browser/browsercontext/cookie) ([browser#1008](https://github.com/grafana/xk6-browser/pull/1008), [browser#1030](https://github.com/grafana/xk6-browser/pull/1030)) that can be used while creating and retrieving cookies. This enabled us to add a new [`browserContext.cookies([urls])`](https://k6.io/docs/javascript-api/k6-experimental/browser/browsercontext/cookies/) method ([browser#1005](https://github.com/grafana/xk6-browser/pull/1005)) that returns all cookies from the current [browser context](https://k6.io/docs/javascript-api/k6-experimental/browser/browsercontext). The new API also supports filtering cookies by URL ([browser#1016](https://github.com/grafana/xk6-browser/pull/1016)).

That led to fixing a bug where the `expires` field was not being set correctly while adding cookies using the [`context.addCookie()`](https://k6.io/docs/javascript-api/k6-experimental/browser/browsercontext/addcookies/) method ([browser#1031](https://github.com/grafana/xk6-browser/pull/1031)). Lastly, the existing [`context.clearCookies()`](https://k6.io/docs/javascript-api/k6-experimental/browser/browsercontext/clearcookies) method was fixed to clear all cookies from the current [browser context](https://k6.io/docs/javascript-api/k6-experimental/browser/browsercontext) ([browser#1040](https://github.com/grafana/xk6-browser/pull/1040)).

js ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```js
const context = browser.newContext();
context.addCookies([
  { name: 'foo', value: 'bar', url: 'https://test.k6.io' },
  { name: 'baz', value: 'qux', url: 'https://grafana.com' },
]);

const cookies = context.cookies('https://test.k6.io');
console.log(cookies.length); // 1
console.log(cookies[0].name); // foo
console.log(cookies[0].value); // bar

context.clearCookies();
console.log(context.cookies.length); // 0
```

### Add support for browser module’s `page.on('console')` [browser#1006](https://github.com/grafana/xk6-browser/pull/1006)

Allows users to register a handler to be executed every time the `console` API methods are called from within the page’s JavaScript context. The arguments passed into the handler are defined by the [ConsoleMessage](https://k6.io/docs/javascript-api/k6-experimental/browser/consolemessage/) class.

js ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```js
page.on('console', (msg) => {
  check(msg, {
    assertConsoleMessageType: (msg) => msg.type() == 'log',
    assertConsoleMessageText: (msg) => msg.text() == 'this is a console.log message 42',
    assertConsoleMessageArgs0: (msg) =>
      msg.args()[0].jsonValue() == 'this is a console.log message',
    assertConsoleMessageArgs1: (msg) => msg.args()[1].jsonValue() == 42,
  });
});

page.evaluate(() => console.log('this is a console.log message', 42));
```

* * *

For a full list of changes, including UX improvements and bug fixes, refer to [full release notes](https://github.com/grafana/k6/blob/master/release%20notes/v0.47.0.md).
