{"id":13761650,"url":"https://github.com/census-instrumentation/opencensus-web","last_synced_at":"2025-05-10T14:30:38.625Z","repository":{"id":31356913,"uuid":"109782894","full_name":"census-instrumentation/opencensus-web","owner":"census-instrumentation","description":"A stats collection and distributed tracing framework","archived":true,"fork":false,"pushed_at":"2023-06-28T22:25:13.000Z","size":6506,"stargazers_count":174,"open_issues_count":258,"forks_count":21,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-10-15T10:05:12.706Z","etag":null,"topics":["cloud","distributed-tracing","end-user-monitoring","instrumentation","metrics","monitoring","opencensus","real-user-monitoring","stats","trace","tracing"],"latest_commit_sha":null,"homepage":"https://opencensus.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/census-instrumentation.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS"}},"created_at":"2017-11-07T03:35:50.000Z","updated_at":"2024-05-31T08:19:15.000Z","dependencies_parsed_at":"2023-12-16T02:45:21.388Z","dependency_job_id":"e5b85de8-8d7a-4e53-9a55-1146788630a4","html_url":"https://github.com/census-instrumentation/opencensus-web","commit_stats":{"total_commits":139,"total_committers":12,"mean_commits":"11.583333333333334","dds":0.5107913669064748,"last_synced_commit":"5038ad7f66c2875049769c407312c028ffd68e26"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/census-instrumentation%2Fopencensus-web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/census-instrumentation%2Fopencensus-web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/census-instrumentation%2Fopencensus-web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/census-instrumentation%2Fopencensus-web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/census-instrumentation","download_url":"https://codeload.github.com/census-instrumentation/opencensus-web/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224970217,"owners_count":17400292,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloud","distributed-tracing","end-user-monitoring","instrumentation","metrics","monitoring","opencensus","real-user-monitoring","stats","trace","tracing"],"created_at":"2024-08-03T14:00:21.162Z","updated_at":"2024-11-16T20:30:38.343Z","avatar_url":"https://github.com/census-instrumentation.png","language":"TypeScript","funding_links":[],"categories":["Integrations"],"sub_categories":["JavaScript"],"readme":"\u003e **Warning**\n\u003e\n\u003e OpenCensus and OpenTracing have merged to form [OpenTelemetry](https://opentelemetry.io), which serves as the next major version of OpenCensus and OpenTracing.\n\u003e\n\u003e OpenTelemetry has now reached feature parity with OpenCensus, with tracing and metrics SDKs available in .NET, Golang, Java, NodeJS, and Python. **All OpenCensus Github repositories, except [census-instrumentation/opencensus-python](https://github.com/census-instrumentation/opencensus-python), will be archived on July 31st, 2023**. We encourage users to migrate to OpenTelemetry by this date.\n\u003e\n\u003e To help you gradually migrate your instrumentation to OpenTelemetry, bridges are available in Java, Go, Python, and JS. [**Read the full blog post to learn more**](https://opentelemetry.io/blog/2023/sunsetting-opencensus/).\n\n# OpenCensus - A stats collection and distributed tracing framework\n[![Gitter chat][gitter-image]][gitter-url]\n[![NPM Published Version][npm-img]][npm-url]\n[![circleci][circleci-image]][circleci-url]\n[![codecov][codecov-image]][codecov-url]\n[![Known Vulnerabilities][snyk-image]][snyk-url]\n[![Apache License][license-image]][license-url]\n\nOpenCensus Web is an implementation of [OpenCensus][opencensus-url], a toolkit for collecting\napplication performance and behavior monitoring data. \nThis library instruments browser applications to collect user-side performance data.\n\nThe library is in alpha stage and the API is subject to change.\n\nPlease join [gitter][gitter-url] for help or feedback on this project.\n\n## Overview\n\nOpenCensus Web instruments web applications generates traces for the initial page load of a site \nin the browser and the subsequent on-page user interactions after the initial load. Some features \nthat also provides are automatic tracing for *clicks* and *route transitions*, *custom spans*, and browser \n[Resource Timing API][resource-timing-url] data.\n\nIt supports sending the trace sampling decision and trace ID from the web server to the\nbrowser client to enable latency debugging across the stack.\n\n## Architecture\n\nOpenCensus Web interacts with three application components:\n\n- *Frontend web server*: renders the initial HTML to the browser including the OpenCensus Web library code \n  and the necessary configuration (e.g. window.ocAgent). This server would typically be instrumented with an \n  OpenCensus server-side library (Go, Java, etc.) that can attach the server-side spans to the trace, \n  that is sending the Trace Context Header in the [W3C draft format][trace-context-url] via a `window.traceparent` \n  global variable.\n  We also suggest that you create an endpoint in the server that receives the HTTP/JSON traces and proxies \n  to the OpenCensus Agent.\n\n- *Browser JS*: the OpenCensus Web library code that runs in the browser. This measures user interactions and \n  collects browser data and writes them to the OpenCensus Agent as spans via HTTP/JSON.\n\n- *OpenCensus Agent*: receives traces from either the *frontend web server proxy endpoint* or directly from \n  the *browser JS*, depending on  the way you deploy it, and exports them to a trace backend (e.g. Stackdriver, Zipkin). \n\n![architecture-diagram](images/architecture_diagram.png)\n\n## Features\n\n### Trace spans for initial load including server side HTML rendering\n\nHere's a sample trace from OpenCensus Web that was exported to\n[Zipkin][zipkin-url]. Notice that there is an overall `nav./` span for the user\nnavigation experience until the browser `load` event fires. There are also \n`/` spans for the client and server side measurements of the initial HTML load.\nThe server side spans also indicates how much time was spent parsing and \nrendering the template:\n\n![zipkin-waterfall](images/zipkin_waterfall.png)\n\nThese spans are generated via the browser's\n[Navigation Timing][navigation-timing-url] and\n[Resource Timing][resource-timing-url] APIs. Notice also the `long js task`\nspan, which indicates a CPU-bound JavaScript event loop that took more than 50ms\nas measured by the [Long Tasks][long-tasks-url] browser API.\n\n### Span annotations for DOM and network events\n\nThe OpenCensus Web spans also include detailed annotations for DOM load events\nlike `domInteractive` and `first-paint`, as well as network events like\n`domainLookupStart` and `secureConnectionStart`. Here is a similar trace\nexported to [Stackdriver Trace][stackdriver-trace-url] with the annotations\nexpanded:\n\n![stackdriver-trace-events](images/stackdriver_trace_events.png)\n\nThese annotations also comine from the\n[Resource Timing API][resource-timing-url]. Note that for resources fetched via\nCORS, you will need to specify the\n[Timing-Allow-Origin header][timing-allow-origin-url].\n\n### Automatic tracing for click events\nOpenCensus Web automatically traces all the *click events* as long as the click is done in a DOM element \n(e.g. button) and it is not *disabled*. When the user clicks an element, an interaction is started to \nmeasure all the synchronous and asynchronous code that this interaction may trigger, like network calls or \nJS code execution. \n\nOC Web provides the option of adding the attribute `data-ocweb-id` to HTML elements and give a custom name \nto the interaction. For the next example, the resulting name will be *‘Save edit user info’*:\n\n```html\n\u003cbutton type=\"submit\" data-ocweb-id=\"Save edit user info\"\u003e Save changes \u003c/button\u003e\n```\n\nIn case you don’t add this attribute, OC web will use the *DOM element ID*, the *tag name* plus the *event name* \ninvolved in the interaction to generate a CSS selector name. For example, clicking this button:\n\n```html\n\u003cbutton id=\"save_changes\"\u003e Save changes \u003c/button\u003e\n```\nwould generate a span named: *'button#save_changes click'*.\n\n### Automatic tracing for route transitions\nOC Web traces route transitions between the different sections of your page by monkey-patching the \n[History API][history-api-url]. OC Web names this kind of interaction as ‘Navigation /path/to/page’. \nThe following trace exported to Stackdriver Trace shows a span named *Navigation /second_page* which \ninvolves some network calls before the route transition is complete:\n\n![navigation-trace-image](images/navigation_trace.png)\n\n### Create your own spans\nInstrument your web application with custom spans for tasks or code involved in a user interaction. \nHere is a code snippet in JavaScript that shows how to do this with the npm package dependency:\n\n```javascript\nimport { tracing } from '@opencensus/web-instrumentation-zone';\n\nfunction handleClick() {\n  // Start child span which will be child of the current root span on the current interaction.\n  // To make sure the span is attached to the root span, add this in code that the button is running.\n  const childSpan = tracing.tracer.startChildSpan({\n    name: 'name of your child span'\n  });\n  // Do some operation...\n  // Finish the child span at the end of it's operation\n  childSpan.end();\n}\n\n// Create a fake button to point out the custom span is created in the click handler.\nconst button = document.createElement('button');\nbutton.onclick = handleClick;\n```\n\n### Automatic spans for HTTP requests and Browser performance data.\nOC Web intercepts HTTP requests generated by an interaction (specifically `XMLHttpRequest` objects) \nto automatically create a span for this HTTP request and measure it. Additionally, OC Web sends along \nthe HTTP request a Trace Context Header in the [W3C Trace Context][trace-context-url] format to the server \nas long as the URL is the same origin or matches a provided regex. To provide this *Regex*, \nadd the `ocTraceHeaderHostRegex` global variable. \n\nIn case the server is instrumented with OpenCensus, you can see attached the spans coming from the server \nand be able to know the server performance as well. This lets you know if the issues are related to either \nthe front-end or the server-side.\n\nOC Web also includes [Performance Resource Timing API][resource-timing-url] data to make annotations like\n`domainLookupStart` and `responseEnd`, also, generates spans for any [CORS preflight][cors-preflight-url] requests.\n\nThe next screenshot shows a trace exported to Stackdriver Trace. Notice the several network calls with the automatic \ngenerated spans (e.g. *‘Sent./sleep’*) with the respective annotations. Also, there are server-side \nspans (e.g. *‘/sleep’* and *‘ocweb.handlerequest’*) and *CORS Preflight* related spans.\n\n![automatic-spans-http](images/http_request_spans.png)\n\n### Relate user interactions back to the initial page load tracing.\nOC Web attaches the *initial page load trace id* to the user interactions as an *attribute* and a *span link*. \nThis enables search by attribute to find the *initial load trace* and the interaction traces happening after \nthe initial load via a single attribute query.\n\nThe next screenshot from Stackdriver Trace shows a search by `initial_load_trace_id` attribute containing all \nuser interaction traces after the initial page loaded.\n\n![all-traces](images/relate_initial_with_interactions.png)\n\n### Export traces to Zipkin, Jaeger, Stackdriver, DataDog, Honeycomb and more\n\nThe OpenCensus Web library exports traces via the\n[OpenCensus Agent][oc-agent-url], which can then export them to a variety of\ntrace backends. See the\n[OpenCensus Agent/Collector exporter docs][oc-agent-exporter-url] for details.\n\n## Usage\n\nBelow are the steps that are currently needed to use it.\n\n### 1. Deploy the OpenCensus agent to collect traces\n\nThe OpenCensus Web library currently only exports traces via the\n[OpenCensus Agent][oc-agent-url], which can then export them to a trace backend\n(e.g. Zipkin, Stackdriver). See this [example's README][initial-load-example-url]\nfor steps to run the agent locally or in the cloud.\n\nWhen you run the agent in the cloud you will need to expose it to your\napplication via the internet. You may also to proxy the agent behind the\nauthentication or CSRF protection layer of your application to to only allow\ntraces to be written by authenticated end users.\n\n### 2. Use the OpenCensus Web library code in your application\n\nOpenCensus Web gives tree ways to use it in your application, where you can either\nonly import the code for the *initial page load* tracing or the whole OpenCensus Web tracing\nincluding the *initial page load* and *user interaction tracing*.\n\nSee the [examples/initial_load][examples-initial-load-url] folder for a full\nexample of how to use *initial page load* functionality in your application. Also, see the \n[examples/user_interaction][examples-user-interaction-url] folder for a full\nexample of how to also trace the user interactions.\n\n#### Using via a `\u003cscript\u003e` tag\n\nYou can use OpenCensus Web via a `\u003cscript\u003e` tag that makes uses of the\n\u003cunpkg.com\u003e CDN that serves files from NPM packages.\n\nThe script tag should go before the `\u003c/body\u003e`. You will also need to set the\n`ocAgent` endpoint in a different `\u003cscript\u003e` and may also specify the \ntrace sample rate via an `ocSampleRate` global variable as well.\n\n- If you only want to use the **initial page load** functionality:\n  ```html\n  ...\n    \u003cscript\u003e\n      // HTTP endpoint of the OpenCensus Agent you ran and exposed to the internet\n      // in Step 1 above.\n      ocAgent = 'https://example.com/my-opencensus-agent-endpoint';\n\n      // Sample all requests for trace, which is useful when testing.\n      // By default this is set to sample 1/10000 requests.\n      ocSampleRate = 1.0;  \n    \u003c/script\u003e\n    \u003cscript src=\"https://unpkg.com/@opencensus/web-scripts@0.0.7/dist/initial-load-all.js\"\n            integrity=\"sha384-IRF14Fru3e56WqS/NSK/tIqe8eU5ISYAWuArwIige2xagIyEofDydPWvyz1O6Tyd\"\n            async crossorigin=\"anonymous\"\u003e\n    \u003c/script\u003e\n  \u003c/body\u003e\n  ```\n\n- If you want to **trace user interactions**, you have two options:\n  In addition to the previously explained variables, you need to set the `ocTraceHeaderHostRegex`\n  regex to tell the OC Web which HTTP requests can be intercepted in a interaction to send the \n  *Trace Context Header*.\n\n  ```html\n    ...\n    \u003cscript\u003e\n      // HTTP endpoint of the OpenCensus Agent you ran and exposed to the internet\n      // in Step 1 above.\n      ocAgent = 'https://example.com/my-opencensus-agent-endpoint';\n\n      // Sample all requests for trace, which is useful when testing.\n      // By default this is set to sample 1/10000 requests.\n      ocSampleRate = 1.0;\n      \n      // Send the trace header to all hosts.\n      window.ocTraceHeaderHostRegex = /.*/;\n    \u003c/script\u003e\n    ...\n  ```\n\n  - If your application doesn't already use the `Zone.js` library, the case for *non-Angular* apps\n    (e.g. React, etc.): \n    ```html\n        ...\n        \u003cscript src=\"https://unpkg.com/@opencensus/web-scripts@0.0.7/dist/tracing-all-with-zone.js\"\n                integrity=\"sha384-Ev17Xogwh4ZeYjMR3Bk/2evQt4lFkK3wNmaqVIsihf5odhOAA5Uroq/o8epjrb8b\"\n                async crossorigin=\"anonymous\"\u003e\n        \u003c/script\u003e\n      \u003c/body\u003e\n    ```\n\n  - If your application uses the `Zone.js` library, the case for `Angular` apps:\n    ```html\n        ...\n        \u003cscript src=\"https://unpkg.com/@opencensus/web-scripts@0.0.7/dist/tracing-all-zone-peer-dep.js\"\n                integrity=\"sha384-98qotOMH5C0Pbew7R2i8JAQ3Mz0dTP3H25DDXbl4ONcA52mKLqPgIAitUlr64C/q\"\n                async crossorigin=\"anonymous\"\u003e\n        \u003c/script\u003e\n      \u003c/body\u003e\n    ```\n\nYou can also host the bundled scripts from your own site. For\ndocs on how to build the bundle see the\n[@opencensus/web-scripts readme][package-web-scripts].\n\n#### Using as NPM dependency in existing JS build\n\nIf you already have a JS build pipeline using e.g. webpack or similar, you can do:\n\n- `npm install @opencensus/web-initial-load` to instrument your application with only \n  the **initial page load** functionality and then set the configuration variables and \n  trigger the recording and exporting of the initial load spans as follows:\n\n  ```js\n  import { exportRootSpanAfterLoadEvent } from '@opencensus/web-initial-load';\n\n  window.ocAgent = 'https://example.com/my-opencensus-agent-endpoint';\n  window.ocSampleRate = 1.0; // Sample at 100% for test only. Default is 1/10000.\n\n  // Send the root span and child spans for the initial page load to the\n  // OpenCensus agent if this request was sampled for trace.\n  exportRootSpanAfterLoadEvent();\n  ```\n\n- You can `npm install @opencensus/web-instrumentation-zone` or \n  `npm install @opencensus/web-instrumentation-zone-peer-dep`, this depends on whether your\n  application already uses `Zone.js` or not (e.g. Angular already does it). Then you can set the\n  configuration variables and start the tracing as follows:\n\n  ```js\n  // Use @opencensus/web-instrumentation-zone-peer-dep instead in case your app\n  // already uses `Zone.js`.\n  import { startTracing } from '@opencensus/web-instrumentation-zone';\n\n  window.ocAgent = 'https://example.com/my-opencensus-agent-endpoint';\n  window.ocSampleRate = 1.0; // Sample at 100% for test only. Default is 1/10000.\n  // Send the trace header to all hosts.\n  window.ocTraceHeaderHostRegex = /.*/;\n\n  // This methods starts the tracing and exports the initial page load trace.\n  // As the tracing has started, the coming user interactions ares also traced.\n  startTracing();\n  ```\nThe default propagation uses the [W3C Trace Context](https://www.w3.org/TR/trace-context/) format. You can also use\n[Zipkin's B3 Propagation](https://github.com/openzipkin/b3-propagation). See the \n[@opencensus/web-propagation-b3 README][package-web-propagation-b3] for details.\n\n### 3. Optional: Send a trace parent and sampling decision from your server\n\nOpenCensus Web also supports connecting the server side spans for the initial\nHTML load with the client side span for the load from the browser's timing API.\nThis works by having the server send its parent trace context (trace ID, span ID\nand trace sampling decision) to the client.\n\nBecause the browser does not send a trace context header for the initial page\nnavigation, the server needs to fake a trace context header in a middleware and\nthen send that trace context header back to the client as a global `traceparent`\nvariable. The `traceparent` variable should be in the\n[trace context W3C draft format][trace-context-url]. For example:\n\n```html\n  ...\n  \u003cscript\u003e\n    ocAgent = 'https://example.com/my-opencensus-agent-endpoint';\n    // Set the `traceparent` in the server's HTML template code. It should be\n    // dynamically generated server side to have the server's request trace ID,\n    // a parent span ID that was set on the server's request span, and the trace\n    // flags to indicate the server's sampling decision (01 = sampled, 00 = not\n    // sampled).\n    traceparent = '00-{{ServerTraceId}}-{{ServerParentSpanId}}-{{ServerTraceFlags}}';\n    // We don't need to specify `ocSampleRate` since the trace sampling decision\n    // is coming from the `traceparent` global variable instead.\n  \u003c/script\u003e\n  \u003cscript src=\"https://unpkg.com/@opencensus/web-scripts@0.0.7/dist/initial-load-all.js\"\n          integrity=\"sha384-IRF14Fru3e56WqS/NSK/tIqe8eU5ISYAWuArwIige2xagIyEofDydPWvyz1O6Tyd\"\n          async crossorigin=\"anonymous\"\u003e\n  \u003c/script\u003e\n\u003c/body\u003e\n```\nIn case you want to use trace user interactions:\n\n```html\n  ...\n  \u003cscript\u003e\n    ocTraceHeaderHostRegex = /.*/;  \n    ocAgent = 'https://example.com/my-opencensus-agent-endpoint';\n    // Set the `traceparent` in the server's HTML template code. It should be\n    // dynamically generated server side to have the server's request trace ID,\n    // a parent span ID that was set on the server's request span, and the trace\n    // flags to indicate the server's sampling decision (01 = sampled, 00 = not\n    // sampled).\n    traceparent = '00-{{ServerTraceId}}-{{ServerParentSpanId}}-{{ServerTraceFlags}}';\n    // We don't need to specify `ocSampleRate` since the trace sampling decision\n    // is coming from the `traceparent` global variable instead.\n  \u003c/script\u003e\n  \u003cscript src=\"https://unpkg.com/@opencensus/web-scripts@0.0.7/dist/tracing-all-with-zone.js\"\n          integrity=\"sha384-Ev17Xogwh4ZeYjMR3Bk/2evQt4lFkK3wNmaqVIsihf5odhOAA5Uroq/o8epjrb8b\"\n          async crossorigin=\"anonymous\"\u003e\n  \u003c/script\u003e\n\u003c/body\u003e\n```\n\n\nTo see a full example of how the middleware to generate a trace context header\nand send it back to the client, see the\n[server.go][initial-load-example-server-go] file and the \n[index.html][initial-load-example-index-html] template in the\n[examples/initial_load][initial-load-example-url] folder.\n\nFor the case you want to trace user interactions see the \n[user interaction example][examples-user-interaction-url]\n\n## Packages\n\nThe OpenCensus web library is composed of the following packages:\n\n- **[@opencensus/web-types][package-web-types]**. This has automatically copied types from the [@opencensus/core][package-core] package of [OpenCensus Node][opencensus-node]. The types are copied because the `@opencensus/core` package has Node-specific dependencies that make it hard to depend on from browser-specific code.\n- **[@opencensus/web-core][package-web-core]**. This has the core span and tracer implementation for web browsers. Currently the tracer assumes there is only one current root span for a given browser tab.\n- **[@opencensus/web-exporter-ocagent][package-web-exporter-ocagent]**. This handles exporting spans to the [OpenCensus Agent][opencensus-service-url]\n- **[@opencensus/web-instrumentation-perf][package-web-instrumentation-perf]**. This is code to convert the initial load resource waterfall timings from the browser [Navigation Timing API][navigation-timing-url] and [Resource Timing API][resource-timing-url] into  the spans for a trace of the overall initial load for a page.\n- **[@opencensus/web-propagation-tracecontext][package-web-propagation-tracecontext]**. This provides utilities to serialize and deserialize a `traceparent` trace context header in the [W3C draft trace context format][trace-context-url]\n- **[@opencensus/web-initial-load][package-web-initial-load]**. This package is in charge of generating the initial load page trace, plus the corresponding sampling decision for OpenCensus Web and \nstoring a global initial load span context to be used by other packages. \n- **[@opencensus/web-scripts][package-web-scripts]**. This depends on all the other OpenCensus Web libraries and provides WebPack builds for JS bundles that can be used in `\u003cscript\u003e` tags. See the documentation\nfor more details on the resulting scripts\n- **[@opencensus/web-instrumentation-zone][package-web-instrumentation-zone]**. This depends on all the other OpenCensus Web packages and provides top-level functions for instrumenting the initial page load and \nuser interaction traces to export them to the OpenCensus Agent. This also uses `Zone.js` library as a install dependency, then, this package should be used if your application does not already depends on that.\n- **[@opencensus/web-instrumentation-zone-peer-dep][package-web-instrumentation-zone-peer-dep]**. This depends on all the other OpenCensus Web packages and provides top-level functions for instrumenting the initial \npage load and user interaction traces to export them to the OpenCensus Agent. This uses `Zone.js` library as a peer dependency, then, this package should be used if your application already depends on that \n(e.g. Angular applications).\n\n## Useful links\n- For more information on OpenCensus, visit: \u003chttps://opencensus.io/\u003e\n- For help or feedback on this project, join us on [gitter][gitter-url]\n\n## Versioning\n\nThis library follows [Semantic Versioning][semver-url].\n\n**GA**: Libraries defined at a GA quality level are stable, and will not introduce\nbackwards-incompatible changes in any minor or patch releases. We will address issues and requests\nwith the highest priority. If we were to make a backwards-incompatible changes on an API, we will\nfirst mark the existing API as deprecated and keep it for 18 months before removing it.\n\n**Beta**: Libraries defined at a Beta quality level are expected to be mostly stable and we're\nworking towards their release candidate. We will address issues and requests with a higher priority.\nThere may be backwards incompatible changes in a minor version release, though not in a patch\nrelease. If an element is part of an API that is only meant to be used by exporters or other\nopencensus libraries, then there is no deprecation period. Otherwise, we will deprecate it for 18\nmonths before removing it, if possible.\n\n**Alpha**: Libraries defined at an Alpha quality level can be unstable and could cause crashes or data loss. Alpha software may not contain all of the features that are planned for the final version. The API is subject to change.\n\n## License\n\nApache 2.0 - See [LICENSE][license-url] for more information.\n\n[circleci-image]: https://circleci.com/gh/census-instrumentation/opencensus-web.svg?style=shield\n[circleci-url]: https://circleci.com/gh/census-instrumentation/opencensus-web\n[codecov-image]: https://codecov.io/gh/census-instrumentation/opencensus-web/branch/master/graph/badge.svg\n[codecov-url]: https://codecov.io/gh/census-instrumentation/opencensus-web\n[examples-initial-load-url]: https://github.com/census-instrumentation/opencensus-web/tree/master/examples/initial_load\n[examples-user-interaction-url]: https://github.com/census-instrumentation/opencensus-web/tree/master/examples/user_interaction\n[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg\n[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge\n[initial-load-example-index-html]: https://github.com/census-instrumentation/opencensus-web/blob/master/examples/initial_load/index.html\n[initial-load-example-server-go]: https://github.com/census-instrumentation/opencensus-web/blob/master/examples/initial_load/server.go\n[initial-load-example-url]: https://github.com/census-instrumentation/opencensus-web/tree/master/examples/initial_load\n[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat\n[license-url]: https://github.com/census-instrumentation/opencensus-web/blob/master/LICENSE\n[long-tasks-url]: https://w3c.github.io/longtasks/\n[navigation-timing-url]: https://www.w3.org/TR/navigation-timing-2/\n[npm-img]: https://badge.fury.io/js/%40opencensus%2Fweb-core.svg\n[npm-url]: https://www.npmjs.com/package/@opencensus/web-core\n[oc-agent-exporter-url]: https://github.com/census-instrumentation/opencensus-service/tree/master/exporter\n[oc-agent-url]: https://github.com/census-instrumentation/opencensus-service\n[oc-web-issue-url]: https://github.com/census-instrumentation/opencensus-web/issues/new/choose\n[opencensus-url]: https://opencensus.io/\n[opencensus-node-url]: https://github.com/census-instrumentation/opencensus-node\n[opencensus-service-url]: https://github.com/census-instrumentation/opencensus-service\n[package-core]: https://github.com/census-instrumentation/opencensus-node/tree/master/packages/opencensus-core\n[package-web-scripts]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-scripts\n[package-web-core]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-core\n[package-web-exporter-ocagent]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-exporter-ocagent\n[package-web-initial-load]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-initial-load\n[package-web-instrumentation-perf]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-instrumentation-perf\n[package-web-propagation-tracecontext]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-propagation-tracecontext\n[package-web-propagation-b3]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-propagation-b3\n[package-web-types]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-types\n[package-web-instrumentation-zone]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-instrumentation-zone\n[package-web-instrumentation-zone-peer-dep]: https://github.com/census-instrumentation/opencensus-web/tree/master/packages/opencensus-web-instrumentation-zone-peer-dep\n[resource-timing-url]: https://www.w3.org/TR/resource-timing-2/\n[semver-url]: http://semver.org/\n[snyk-image]: https://snyk.io/test/github/census-instrumentation/opencensus-web/badge.svg?style=flat\n[snyk-url]: https://snyk.io/test/github/census-instrumentation/opencensus-web\n[stackdriver-trace-url]: https://cloud.google.com/trace/\n[timing-allow-origin-url]: https://www.w3.org/TR/resource-timing-2/#dfn-timing-allow-origin\n[trace-context-url]: https://www.w3.org/TR/trace-context/\n[tsickle-url]: https://github.com/angular/tsickle\n[zipkin-url]: https://zipkin.io/\n[history-api-url]: https://developer.mozilla.org/en-US/docs/Web/API/History\n[cors-preflight-url]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcensus-instrumentation%2Fopencensus-web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcensus-instrumentation%2Fopencensus-web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcensus-instrumentation%2Fopencensus-web/lists"}