Browser
This guide uses the example application in HTML & javascript provided below, but the steps to instrument your own application should be broadly the same. Here is an overview of what we will be doing.
- Install the required OpenTelemetry libraries
- Initialize a global tracer
- Initialize and register a span exporter
This is a very simple guide, if you’d like to see more complex examples go to examples/tracer-web
Copy the following file into an empty directory and call it index.html
.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Document Load Plugin Example</title>
<base href="/">
<!--
https://www.w3.org/TR/trace-context/
Set the `traceparent` in the server's HTML template code. It should be
dynamically generated server side to have the server's request trace Id,
a parent span Id that was set on the server's request span, and the trace
flags to indicate the server's sampling decision
(01 = sampled, 00 = notsampled).
'{version}-{traceId}-{spanId}-{sampleDecision}'
-->
<meta name="traceparent" content="00-ab42124a3c573678d4d8b21ba52df3bf-d21f7bc17caa5aba-01">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
Example of using Web Tracer with document load plugin with console exporter and collector exporter
</body>
</html>
Installation
To create traces in the browser, you will need @opentelemetry/web
, and the plugin @opentelemetry/plugin-document-load
:
npm install @opentelemetry/web @opentelemetry/plugin-document-load
In the following we will use parcel as web application bundler, but you can of course also use any other build tool:
npm install -g parcel
Initialization and Configuration
Create a empty file called document-load.js
and add the following code to your html right before the body end tag:
<script type="text/javascript" src="document-load.js"></script>
We will add some code that will trace the document load timings and output those as OpenTelemetry Spans.
Creating a Tracer Provider
Add the following code to the document-load.js
to create a tracer provider, which brings the plugin to trace document load:
// This is necessary for "parcel" to work OOTB. It is not needed for other build tools.
import 'regenerator-runtime/runtime'
import { LogLevel } from "@opentelemetry/core";
import { WebTracerProvider } from '@opentelemetry/web';
import { DocumentLoad } from '@opentelemetry/plugin-document-load';
// Minimum required setup - supports only synchronous operations
const provider = new WebTracerProvider({
plugins: [
new DocumentLoad()
]
});
provider.register();
Run parcel index.html
and open the development webserver (e.g. at http://localhost:1234) to see if your code works.
There will be no output of traces yet, for this we need to add an exporter
Creating a Console Exporter
To export traces, modify document-load.js
so that it matches the following code snippet:
// This is necessary for "parcel" to work OOTB. It is not needed for other build tools.
import 'regenerator-runtime/runtime'
import { LogLevel } from "@opentelemetry/core";
import { WebTracerProvider } from '@opentelemetry/web';
import { DocumentLoad } from '@opentelemetry/plugin-document-load';
import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing';
// Minimum required setup - supports only synchronous operations
const provider = new WebTracerProvider({
plugins: [
new DocumentLoad()
]
});
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()))
provider.register();
Now, rebuild your application and open the browser again. In the console of the developer toolbar you should see some traces being exporterd:
{
"traceId": "ab42124a3c573678d4d8b21ba52df3bf",
"parentId": "cfb565047957cb0d",
"name": "documentFetch",
"id": "5123fc802ffb5255",
"kind": 0,
"timestamp": 1606814247811266,
"duration": 9390,
"attributes": {
"component": "document-load",
"http.response_content_length": 905
},
"status": {
"code": 0
},
"events": [
{
"name": "fetchStart",
"time": [
1606814247,
811266158
]
},
{
"name": "domainLookupStart",
"time": [
1606814247,
811266158
]
},
{
"name": "domainLookupEnd",
"time": [
1606814247,
811266158
]
},
{
"name": "connectStart",
"time": [
1606814247,
811266158
]
},
{
"name": "connectEnd",
"time": [
1606814247,
811266158
]
},
{
"name": "requestStart",
"time": [
1606814247,
819101158
]
},
{
"name": "responseStart",
"time": [
1606814247,
819791158
]
},
{
"name": "responseEnd",
"time": [
1606814247,
820656158
]
}
]
}