<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>k6/net/grpc on Grafana Labs</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/</link><description>Recent content in k6/net/grpc on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/index.xml" rel="self" type="application/rss+xml"/><item><title>Client</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/</guid><content><![CDATA[&lt;h1 id=&#34;client&#34;&gt;Client&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Client&lt;/code&gt; is a gRPC client that can interact with a gRPC server.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Method&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-load/&#34;&gt;Client.load(importPaths, &amp;hellip;protoFiles)&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Loads and parses the given protocol buffer definitions to be made available for RPC requests.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-loadprotoset/&#34;&gt;Client.loadProtoset(protosetPath)&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Loads and parses the given protoset file to be made available for RPC requests.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-connect/&#34;&gt;Client.connect(address [,params])&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Opens a connection to the given gRPC server.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-invoke/&#34;&gt;Client.invoke(url, request [,params])&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Makes an unary RPC for the given service/method and returns a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/response/&#34;&gt;Response&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-health-check/&#34;&gt;Client.healthCheck([service])&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Check the status of the service using the &lt;a href=&#34;https://grpc.io/docs/guides/health-checking&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Health Checking&lt;/a&gt; protocol.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-close/&#34;&gt;Client.close()&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Close the connection to the gRPC service.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;examples&#34;&gt;Examples&lt;/h3&gt;
&lt;div class=&#34;code-group&#34; data-props=&#39;{&#34;labels&#34;: [&#34;Simple example&#34;], &#34;lineNumbers&#34;: [true]}&#39;&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;

const client = new grpc.Client();
// Download quickpizza.proto for grpc-quickpizza.grafana.com, located at:
// https://raw.githubusercontent.com/grafana/quickpizza/refs/heads/main/proto/quickpizza.proto
// and put it in the same folder as this script.
client.load(null, &amp;#39;quickpizza.proto&amp;#39;);

export default () =&amp;gt; {
  client.connect(&amp;#39;grpc-quickpizza.grafana.com:443&amp;#39;, { timeout: &amp;#39;5s&amp;#39; });

  const response = client.invoke(&amp;#39;quickpizza.GRPC/RatePizza&amp;#39;, {
    ingredients: [&amp;#39;Tomatoes&amp;#39;, &amp;#39;Cheese&amp;#39;],
    dough: &amp;#39;Thin&amp;#39;,
  });
  console.log(response.message.starsRating); // should print a number between 1-5

  client.close();
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;code-group&#34; data-props=&#39;{&#34;labels&#34;: [&#34;Authorization&#34;], &#34;lineNumbers&#34;: [true]}&#39;&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load([], &amp;#39;authorization.proto&amp;#39;, &amp;#39;route_guide.proto&amp;#39;);

export function setup() {
  client.connect(&amp;#39;auth.googleapis.com:443&amp;#39;);
  const resp = client.invoke(&amp;#39;google.cloud.authorization.v1.AuthService/GetAccessToken&amp;#39;, {
    username: &amp;#39;john.smith@k6.io&amp;#39;,
    password: &amp;#39;its-a-secret&amp;#39;,
  });
  client.close();
  return resp.message.accessToken;
}

export default (token) =&amp;gt; {
  client.connect(&amp;#39;route.googleapis.com:443&amp;#39;);
  const metadata = {
    authorization: `bearer ${token}`,
  };
  const response = client.invoke(
    &amp;#39;google.cloud.route.v1.RoutingService/GetFeature&amp;#39;,
    {
      latitude: 410248224,
      longitude: -747127767,
    },
    { metadata }
  );
  check(response, { &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK });
  client.close();
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;code-group&#34; data-props=&#39;{&#34;labels&#34;: [&#34;Single connection&#34;], &#34;lineNumbers&#34;: [true]}&#39;&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load([], &amp;#39;language_service.proto&amp;#39;);

export default () =&amp;gt; {
  if (__ITER == 0) {
    client.connect(&amp;#39;language.googleapis.com:443&amp;#39;);
  }
  const response = client.invoke(&amp;#39;google.cloud.language.v1.LanguageService/AnalyzeSentiment&amp;#39;, {});
  check(response, { &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK });
  // Do NOT close the client
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="client">Client&lt;/h1>
&lt;p>&lt;code>Client&lt;/code> is a gRPC client that can interact with a gRPC server.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-load/">Client.load(importPaths, &amp;hellip;protoFiles)&lt;/a>&lt;/td>
&lt;td>Loads and parses the given protocol buffer definitions to be made available for RPC requests.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-loadprotoset/">Client.loadProtoset(protosetPath)&lt;/a>&lt;/td>
&lt;td>Loads and parses the given protoset file to be made available for RPC requests.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-connect/">Client.connect(address [,params])&lt;/a>&lt;/td>
&lt;td>Opens a connection to the given gRPC server.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-invoke/">Client.invoke(url, request [,params])&lt;/a>&lt;/td>
&lt;td>Makes an unary RPC for the given service/method and returns a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/response/">Response&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-health-check/">Client.healthCheck([service])&lt;/a>&lt;/td>
&lt;td>Check the status of the service using the &lt;a href="https://grpc.io/docs/guides/health-checking" target="_blank" rel="noopener noreferrer">Health Checking&lt;/a> protocol.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/client-close/">Client.close()&lt;/a>&lt;/td>
&lt;td>Close the connection to the gRPC service.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="examples">Examples&lt;/h3>
&lt;div class="code-group" data-props='{"labels": ["Simple example"], "lineNumbers": [true]}'>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import grpc from &amp;#39;k6/net/grpc&amp;#39;;
const client = new grpc.Client();
// Download quickpizza.proto for grpc-quickpizza.grafana.com, located at:
// https://raw.githubusercontent.com/grafana/quickpizza/refs/heads/main/proto/quickpizza.proto
// and put it in the same folder as this script.
client.load(null, &amp;#39;quickpizza.proto&amp;#39;);
export default () =&amp;gt; {
client.connect(&amp;#39;grpc-quickpizza.grafana.com:443&amp;#39;, { timeout: &amp;#39;5s&amp;#39; });
const response = client.invoke(&amp;#39;quickpizza.GRPC/RatePizza&amp;#39;, {
ingredients: [&amp;#39;Tomatoes&amp;#39;, &amp;#39;Cheese&amp;#39;],
dough: &amp;#39;Thin&amp;#39;,
});
console.log(response.message.starsRating); // should print a number between 1-5
client.close();
};&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-group" data-props='{"labels": ["Authorization"], "lineNumbers": [true]}'>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;
const client = new grpc.Client();
client.load([], &amp;#39;authorization.proto&amp;#39;, &amp;#39;route_guide.proto&amp;#39;);
export function setup() {
client.connect(&amp;#39;auth.googleapis.com:443&amp;#39;);
const resp = client.invoke(&amp;#39;google.cloud.authorization.v1.AuthService/GetAccessToken&amp;#39;, {
username: &amp;#39;john.smith@k6.io&amp;#39;,
password: &amp;#39;its-a-secret&amp;#39;,
});
client.close();
return resp.message.accessToken;
}
export default (token) =&amp;gt; {
client.connect(&amp;#39;route.googleapis.com:443&amp;#39;);
const metadata = {
authorization: `bearer ${token}`,
};
const response = client.invoke(
&amp;#39;google.cloud.route.v1.RoutingService/GetFeature&amp;#39;,
{
latitude: 410248224,
longitude: -747127767,
},
{ metadata }
);
check(response, { &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK });
client.close();
};&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-group" data-props='{"labels": ["Single connection"], "lineNumbers": [true]}'>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;
const client = new grpc.Client();
client.load([], &amp;#39;language_service.proto&amp;#39;);
export default () =&amp;gt; {
if (__ITER == 0) {
client.connect(&amp;#39;language.googleapis.com:443&amp;#39;);
}
const response = client.invoke(&amp;#39;google.cloud.language.v1.LanguageService/AnalyzeSentiment&amp;#39;, {});
check(response, { &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK });
// Do NOT close the client
};&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Params</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/params/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/params/</guid><content><![CDATA[&lt;h1 id=&#34;params&#34;&gt;Params&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Params&lt;/em&gt; is an object used by the gRPC methods that generate RPC requests. &lt;em&gt;Params&lt;/em&gt; contains request-specific options like headers that should be inserted into the request.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Name&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Params.authority&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;Specifies the value of the :authority pseudo-header and as the server name in authentication handshake. If missing this is derived from the hostname.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Params.discardResponseMessage&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;Specify if response messages should be discarded. This reduces the amount of memory required, and the amount of garbage collection, which reduces the load on the testing machine and can help produce more reliable test results. Default is &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Params.metadata&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;Object with key-value pairs representing custom metadata the user would like to add to the request. Values of &lt;a href=&#34;https://grpc.io/docs/what-is-grpc/core-concepts/#metadata&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;keys ending with &lt;code&gt;-bin&lt;/code&gt;&lt;/a&gt; will be treated as binary data.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Params.tags&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;Key-value pairs where the keys are names of tags and the values are tag values. Response time metrics generated as a result of the request will have these tags added to them, allowing the user to filter out those results specifically, when looking at results data.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Params.timeout&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string / number&lt;/td&gt;
              &lt;td&gt;Request timeout to use. Default timeout is 60 seconds (&lt;code&gt;&amp;quot;60s&amp;quot;&lt;/code&gt;). &lt;br/&gt; The type can also be a number, in which case k6 interprets it as milliseconds, e.g., &lt;code&gt;60000&lt;/code&gt; is equivalent to &lt;code&gt;&amp;quot;60s&amp;quot;&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example-of-custom-metadata-headers-and-tags&#34;&gt;Example of custom metadata headers and tags&lt;/h3&gt;
&lt;div class=&#34;code-group&#34; data-props=&#39;{&#34;labels&#34;: []}&#39;&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;

const client = new grpc.Client();
client.load([], &amp;#39;route_guide.proto&amp;#39;);

export default function () {
  const req = {
    latitude: 410248224,
    longitude: -747127767,
  };
  const params = {
    metadata: {
      &amp;#39;x-my-header&amp;#39;: &amp;#39;k6test&amp;#39;,
      &amp;#39;x-my-header-bin&amp;#39;: new Uint8Array([1, 2, 3]),
    },
    tags: { k6test: &amp;#39;yes&amp;#39; },
  };
  const response = client.invoke(&amp;#39;main.RouteGuide/GetFeature&amp;#39;, req, params);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="params">Params&lt;/h1>
&lt;p>&lt;em>Params&lt;/em> is an object used by the gRPC methods that generate RPC requests. &lt;em>Params&lt;/em> contains request-specific options like headers that should be inserted into the request.&lt;/p></description></item><item><title>Response</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/response/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/response/</guid><content><![CDATA[&lt;h1 id=&#34;response&#34;&gt;Response&lt;/h1&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Name&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Response.status&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;The response gRPC status code. Use the gRPC 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/constants/&#34;&gt;status constants&lt;/a&gt; to check equality.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Response.message&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;The successful protobuf message, serialized to JSON. Will be &lt;code&gt;null&lt;/code&gt; if &lt;code&gt;status !== grpc.StatusOK&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Response.headers&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;Key-value pairs representing all the metadata headers returned by the gRPC server.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Response.trailers&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;Key-value pairs representing all the metadata trailers returned by the gRPC server.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Response.error&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;If &lt;code&gt;status !== grpc.StatusOK&lt;/code&gt; then the error protobuf message, serialized to JSON; otherwise &lt;code&gt;null&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check, sleep } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load(null, &amp;#39;quickpizza.proto&amp;#39;);

export default () =&amp;gt; {
  client.connect(&amp;#39;grpc-quickpizza.grafana.com:443&amp;#39;, {
    // plaintext: false
  });

  const data = { ingredients: [&amp;#39;Cheese&amp;#39;], dough: &amp;#39;Thick&amp;#39; };
  const response = client.invoke(&amp;#39;quickpizza.GRPC/RatePizza&amp;#39;, data);

  check(response, {
    &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
  });

  client.close();
  sleep(1);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="response">Response&lt;/h1>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Response.status&lt;/code>&lt;/td>
&lt;td>number&lt;/td>
&lt;td>The response gRPC status code. Use the gRPC
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/constants/">status constants&lt;/a> to check equality.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Response.message&lt;/code>&lt;/td>
&lt;td>object&lt;/td>
&lt;td>The successful protobuf message, serialized to JSON. Will be &lt;code>null&lt;/code> if &lt;code>status !== grpc.StatusOK&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Response.headers&lt;/code>&lt;/td>
&lt;td>object&lt;/td>
&lt;td>Key-value pairs representing all the metadata headers returned by the gRPC server.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Response.trailers&lt;/code>&lt;/td>
&lt;td>object&lt;/td>
&lt;td>Key-value pairs representing all the metadata trailers returned by the gRPC server.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Response.error&lt;/code>&lt;/td>
&lt;td>object&lt;/td>
&lt;td>If &lt;code>status !== grpc.StatusOK&lt;/code> then the error protobuf message, serialized to JSON; otherwise &lt;code>null&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check, sleep } from &amp;#39;k6&amp;#39;;
const client = new grpc.Client();
client.load(null, &amp;#39;quickpizza.proto&amp;#39;);
export default () =&amp;gt; {
client.connect(&amp;#39;grpc-quickpizza.grafana.com:443&amp;#39;, {
// plaintext: false
});
const data = { ingredients: [&amp;#39;Cheese&amp;#39;], dough: &amp;#39;Thick&amp;#39; };
const response = client.invoke(&amp;#39;quickpizza.GRPC/RatePizza&amp;#39;, data);
check(response, {
&amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
});
client.close();
sleep(1);
};&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>Stream</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/</guid><content><![CDATA[&lt;h1 id=&#34;stream&#34;&gt;Stream&lt;/h1&gt;
&lt;p&gt;Using a gRPC client creates a stream. The client should be connected to the server (&lt;code&gt;client.connect&lt;/code&gt; called) before creating a stream.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Class/Method&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/&#34;&gt;Stream(client, url, [,params])&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Using a connected 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/&#34;&gt;gRPC client&lt;/a&gt; and the method&amp;rsquo;s URL creates a stream. Optionally, you can pass 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/params/&#34;&gt;&lt;code&gt;params&lt;/code&gt; for additional configuration options&lt;/a&gt; like tags, metadata, etc.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/stream-write/&#34;&gt;Stream.write(message)&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Writes a message to the stream.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/stream-on/&#34;&gt;Stream.on(event, handler)&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Sets up handler functions for various events on the gRPC stream.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/stream-end/&#34;&gt;Stream.end()&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;Signals to the server that the client has finished sending.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/event-handler/&#34;&gt;EventHandler&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;The handler function for various events on the gRPC stream.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/message-metadata/&#34;&gt;Metadata&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;The metadata of a gRPC stream&amp;rsquo;s message.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;examples&#34;&gt;Examples&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;A k6 script that sends several randomly chosen points from the pre-generated feature database with a variable delay in between. Prints the statistics when they are sent from the server.&lt;/em&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Client, Stream } from &amp;#39;k6/net/grpc&amp;#39;;
import { sleep } from &amp;#39;k6&amp;#39;;

const COORD_FACTOR = 1e7;

const GRPC_ADDR = __ENV.GRPC_ADDR || &amp;#39;127.0.0.1:10000&amp;#39;;
const GRPC_PROTO_PATH = __ENV.GRPC_PROTO_PATH || &amp;#39;../../grpc_server/route_guide.proto&amp;#39;;

const client = new Client();
client.load([], GRPC_PROTO_PATH);

// a sample DB of points
const DB = [
  {
    location: { latitude: 407838351, longitude: -746143763 },
    name: &amp;#39;Patriots Path, Mendham, NJ 07945, USA&amp;#39;,
  },
  {
    location: { latitude: 408122808, longitude: -743999179 },
    name: &amp;#39;101 New Jersey 10, Whippany, NJ 07981, USA&amp;#39;,
  },
  {
    location: { latitude: 413628156, longitude: -749015468 },
    name: &amp;#39;U.S. 6, Shohola, PA 18458, USA&amp;#39;,
  },
  {
    location: { latitude: 419999544, longitude: -740371136 },
    name: &amp;#39;5 Conners Road, Kingston, NY 12401, USA&amp;#39;,
  },
  {
    location: { latitude: 414008389, longitude: -743951297 },
    name: &amp;#39;Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA&amp;#39;,
  },
  {
    location: { latitude: 419611318, longitude: -746524769 },
    name: &amp;#39;287 Flugertown Road, Livingston Manor, NY 12758, USA&amp;#39;,
  },
  {
    location: { latitude: 406109563, longitude: -742186778 },
    name: &amp;#39;4001 Tremley Point Road, Linden, NJ 07036, USA&amp;#39;,
  },
  {
    location: { latitude: 416802456, longitude: -742370183 },
    name: &amp;#39;352 South Mountain Road, Wallkill, NY 12589, USA&amp;#39;,
  },
  {
    location: { latitude: 412950425, longitude: -741077389 },
    name: &amp;#39;Bailey Turn Road, Harriman, NY 10926, USA&amp;#39;,
  },
  {
    location: { latitude: 412144655, longitude: -743949739 },
    name: &amp;#39;193-199 Wawayanda Road, Hewitt, NJ 07421, USA&amp;#39;,
  },
];

export default () =&amp;gt; {
  if (__ITER == 0) {
    client.connect(GRPC_ADDR, { plaintext: true });
  }

  const stream = new Stream(client, &amp;#39;main.RouteGuide/RecordRoute&amp;#39;);

  stream.on(&amp;#39;data&amp;#39;, (stats) =&amp;gt; {
    console.log(&amp;#39;Finished trip with&amp;#39;, stats.pointCount, &amp;#39;points&amp;#39;);
    console.log(&amp;#39;Passed&amp;#39;, stats.featureCount, &amp;#39;features&amp;#39;);
    console.log(&amp;#39;Travelled&amp;#39;, stats.distance, &amp;#39;meters&amp;#39;);
    console.log(&amp;#39;It took&amp;#39;, stats.elapsedTime, &amp;#39;seconds&amp;#39;);
  });

  stream.on(&amp;#39;error&amp;#39;, (err) =&amp;gt; {
    console.log(&amp;#39;Stream Error: &amp;#39; &amp;#43; JSON.stringify(err));
  });

  stream.on(&amp;#39;end&amp;#39;, () =&amp;gt; {
    client.close();
    console.log(&amp;#39;All done&amp;#39;);
  });

  // send 5 random items
  for (let i = 0; i &amp;lt; 5; i&amp;#43;&amp;#43;) {
    const point = DB[Math.floor(Math.random() * DB.length)];
    pointSender(stream, point);
  }

  // close the client stream
  stream.end();

  sleep(1);
};

const pointSender = (stream, point) =&amp;gt; {
  console.log(
    &amp;#39;Visiting point &amp;#39; &amp;#43;
      point.name &amp;#43;
      &amp;#39; &amp;#39; &amp;#43;
      point.location.latitude / COORD_FACTOR &amp;#43;
      &amp;#39;, &amp;#39; &amp;#43;
      point.location.longitude / COORD_FACTOR
  );

  // send the location to the server
  stream.write(point.location);

  sleep(0.5);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;A k6 script that sends a rectangle message and results (features) are streamed back to the client.&lt;/em&gt;&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { Client, Stream } from &amp;#39;k6/net/grpc&amp;#39;;
import { sleep } from &amp;#39;k6&amp;#39;;

const COORD_FACTOR = 1e7;

const GRPC_ADDR = __ENV.GRPC_ADDR || &amp;#39;127.0.0.1:10000&amp;#39;;
const GRPC_PROTO_PATH = __ENV.GRPC_PROTO_PATH || &amp;#39;../../grpc_server/route_guide.proto&amp;#39;;

const client = new Client();

client.load([], GRPC_PROTO_PATH);

export default () =&amp;gt; {
  client.connect(GRPC_ADDR, { plaintext: true });

  const stream = new Stream(client, &amp;#39;main.FeatureExplorer/ListFeatures&amp;#39;, null);

  stream.on(&amp;#39;data&amp;#39;, function (feature) {
    console.log(
      &amp;#39;Found feature called &amp;#34;&amp;#39; &amp;#43;
        feature.name &amp;#43;
        &amp;#39;&amp;#34; at &amp;#39; &amp;#43;
        feature.location.latitude / COORD_FACTOR &amp;#43;
        &amp;#39;, &amp;#39; &amp;#43;
        feature.location.longitude / COORD_FACTOR
    );
  });

  stream.on(&amp;#39;end&amp;#39;, function () {
    // The server has finished sending
    client.close();
    console.log(&amp;#39;All done&amp;#39;);
  });

  stream.on(&amp;#39;error&amp;#39;, function (e) {
    // An error has occurred and the stream has been closed.
    console.log(&amp;#39;Error: &amp;#39; &amp;#43; JSON.stringify(e));
  });

  // send a message to the server
  stream.write({
    lo: {
      latitude: 400000000,
      longitude: -750000000,
    },
    hi: {
      latitude: 420000000,
      longitude: -730000000,
    },
  });

  sleep(0.5);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The preceding examples use a demo server, which you can run with the following command (Golang should be installed) in &lt;a href=&#34;https://github.com/grafana/k6&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6 repository&amp;rsquo;s root&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;go run -mod=mod examples/grpc_server/*.go&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="stream">Stream&lt;/h1>
&lt;p>Using a gRPC client creates a stream. The client should be connected to the server (&lt;code>client.connect&lt;/code> called) before creating a stream.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Class/Method&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/">Stream(client, url, [,params])&lt;/a>&lt;/td>
&lt;td>Using a connected
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/client/">gRPC client&lt;/a> and the method&amp;rsquo;s URL creates a stream. Optionally, you can pass
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/params/">&lt;code>params&lt;/code> for additional configuration options&lt;/a> like tags, metadata, etc.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/stream-write/">Stream.write(message)&lt;/a>&lt;/td>
&lt;td>Writes a message to the stream.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/stream-on/">Stream.on(event, handler)&lt;/a>&lt;/td>
&lt;td>Sets up handler functions for various events on the gRPC stream.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/stream-end/">Stream.end()&lt;/a>&lt;/td>
&lt;td>Signals to the server that the client has finished sending.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/event-handler/">EventHandler&lt;/a>&lt;/td>
&lt;td>The handler function for various events on the gRPC stream.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/stream/message-metadata/">Metadata&lt;/a>&lt;/td>
&lt;td>The metadata of a gRPC stream&amp;rsquo;s message.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="examples">Examples&lt;/h3>
&lt;p>&lt;em>A k6 script that sends several randomly chosen points from the pre-generated feature database with a variable delay in between. Prints the statistics when they are sent from the server.&lt;/em>&lt;/p></description></item><item><title>Constants</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/constants/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-net-grpc/constants/</guid><content><![CDATA[&lt;h1 id=&#34;constants&#34;&gt;Constants&lt;/h1&gt;
&lt;p&gt;Define constants to distinguish between 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-net-grpc/response/&#34;&gt;gRPC Response&lt;/a&gt; statuses.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Constant&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusOK&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;OK is returned on success.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusCanceled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Canceled indicates the operation was canceled (typically by the caller).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusUnknown&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Unknown error.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusInvalidArgument&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;InvalidArgument indicates the client specified an invalid argument.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusDeadlineExceeded&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;DeadlineExceeded means operation expired before completion.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusNotFound&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;NotFound means some requested entity (e.g., file or directory) was not found.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusAlreadyExists&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;AlreadyExists means an attempt to create an entity failed because one already exists.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusPermissionDenied&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;PermissionDenied indicates the caller does not have permission to execute the specified operation.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusResourceExhausted&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;ResourceExhausted indicates some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusFailedPrecondition&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;FailedPrecondition indicates operation was rejected because the system is not in a state required for the operation&amp;rsquo;s execution.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusAborted&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Aborted indicates the operation was aborted, typically due to a concurrency issue like sequencer check failures, transaction aborts, etc.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusOutOfRange&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;OutOfRange means operation was attempted past the valid range. E.g., seeking or reading past end of file.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusUnimplemented&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Unimplemented indicates operation is not implemented or not supported/enabled in this service.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusInternal&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Internal errors. Means some invariants expected by the underlying system have been broken.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusUnavailable&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Unavailable indicates the service is currently unavailable. This is a most likely a transient condition and may be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusDataLoss&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;DataLoss indicates unrecoverable data loss or corruption.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;StatusUnauthenticated&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Unauthenticated indicates the request does not have valid authentication credentials for the operation.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check, sleep } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load(null, &amp;#39;quickpizza.proto&amp;#39;);

export default () =&amp;gt; {
  client.connect(&amp;#39;grpc-quickpizza.grafana.com:443&amp;#39;, {
    // plaintext: false
  });

  const data = { ingredients: [&amp;#39;Cheese&amp;#39;], dough: &amp;#39;Thick&amp;#39; };
  const response = client.invoke(&amp;#39;quickpizza.GRPC/RatePizza&amp;#39;, data);

  check(response, {
    &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
  });

  client.close();
  sleep(1);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="constants">Constants&lt;/h1>
&lt;p>Define constants to distinguish between
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-net-grpc/response/">gRPC Response&lt;/a> statuses.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Constant&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>StatusOK&lt;/code>&lt;/td>
&lt;td>OK is returned on success.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusCanceled&lt;/code>&lt;/td>
&lt;td>Canceled indicates the operation was canceled (typically by the caller).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusUnknown&lt;/code>&lt;/td>
&lt;td>Unknown error.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusInvalidArgument&lt;/code>&lt;/td>
&lt;td>InvalidArgument indicates the client specified an invalid argument.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusDeadlineExceeded&lt;/code>&lt;/td>
&lt;td>DeadlineExceeded means operation expired before completion.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusNotFound&lt;/code>&lt;/td>
&lt;td>NotFound means some requested entity (e.g., file or directory) was not found.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusAlreadyExists&lt;/code>&lt;/td>
&lt;td>AlreadyExists means an attempt to create an entity failed because one already exists.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusPermissionDenied&lt;/code>&lt;/td>
&lt;td>PermissionDenied indicates the caller does not have permission to execute the specified operation.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusResourceExhausted&lt;/code>&lt;/td>
&lt;td>ResourceExhausted indicates some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusFailedPrecondition&lt;/code>&lt;/td>
&lt;td>FailedPrecondition indicates operation was rejected because the system is not in a state required for the operation&amp;rsquo;s execution.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusAborted&lt;/code>&lt;/td>
&lt;td>Aborted indicates the operation was aborted, typically due to a concurrency issue like sequencer check failures, transaction aborts, etc.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusOutOfRange&lt;/code>&lt;/td>
&lt;td>OutOfRange means operation was attempted past the valid range. E.g., seeking or reading past end of file.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusUnimplemented&lt;/code>&lt;/td>
&lt;td>Unimplemented indicates operation is not implemented or not supported/enabled in this service.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusInternal&lt;/code>&lt;/td>
&lt;td>Internal errors. Means some invariants expected by the underlying system have been broken.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusUnavailable&lt;/code>&lt;/td>
&lt;td>Unavailable indicates the service is currently unavailable. This is a most likely a transient condition and may be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusDataLoss&lt;/code>&lt;/td>
&lt;td>DataLoss indicates unrecoverable data loss or corruption.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>StatusUnauthenticated&lt;/code>&lt;/td>
&lt;td>Unauthenticated indicates the request does not have valid authentication credentials for the operation.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check, sleep } from &amp;#39;k6&amp;#39;;
const client = new grpc.Client();
client.load(null, &amp;#39;quickpizza.proto&amp;#39;);
export default () =&amp;gt; {
client.connect(&amp;#39;grpc-quickpizza.grafana.com:443&amp;#39;, {
// plaintext: false
});
const data = { ingredients: [&amp;#39;Cheese&amp;#39;], dough: &amp;#39;Thick&amp;#39; };
const response = client.invoke(&amp;#39;quickpizza.GRPC/RatePizza&amp;#39;, data);
check(response, {
&amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
});
client.close();
sleep(1);
};&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item></channel></rss>