npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@jessitronica/hny-otel-web

v0.12.0

Published

can i make a package and publish it and use it from html

Readme

My minimal wrapper around Honeycomb's SDK

Currently (November 2023), OpenTelemetry doesn't offer a single .js file that I can import in a script tag.

I want this so that my toy app can send spans to Honeycomb to tell me that someone hit the page, and when some JS threw an error.

This repository constructs a .js file, wrapping the OpenTelemetry libraries, using esbuild to bundle the necessary code up.

Make your own distribution

I don't recommend using this; instead, I recommend copying it and making your own tiny distribution that does what you want and nothing else. This one is very optimized for debugging.

Use

<script src="https://unpkg.com/@jessitronica/[email protected]/dist/hny.min.js"></script>
<script>
  window.Hny.initializeTracing({
    debug: false,
    apiKey: "your-honeycomb-ingest-api-key",
    serviceName: "my-app",
    provideOneLinkToHoneycomb: true,
  });
</script>

This wrapper follows the Honeycomb docs as of December 2025.

Bundle Size:

  • Minified (production): ~219 KB
  • Unminified (development): ~543 KB

These sizes are uncompressed. With gzip compression (typically enabled by CDNs and web servers), the actual transfer size is significantly smaller.

API Reference

The following functions are available on window.Hny:

initializeTracing(config)

Initializes OpenTelemetry tracing with Honeycomb. Required before using other functions.

window.Hny.initializeTracing({
  apiKey: "your-honeycomb-ingest-api-key", // Required
  serviceName: "my-app", // Required, defaults to "unknown_service"
  debug: false, // Optional: sends test span if true
  provideOneLinkToHoneycomb: true, // Optional: logs direct link to Honeycomb UI
});

inSpan(tracerName, spanName, fn)

Creates and records a span around a synchronous function.

Hny.inSpan("my-tracer", "operation-name", () => {
  // Your code here
  // Returns the result of fn
});

inSpanAsync(tracerName, spanName, fn)

Creates and records a span around an asynchronous function.

await Hny.inSpanAsync("my-tracer", "async-operation", async () => {
  // Your async code here
  // Returns a Promise
});

setAttributes(attributes)

Sets attributes on the currently active span.

Hny.setAttributes({
  "customer.id": "123",
  "operation.type": "checkout",
});

recordException(error, additionalAttributes)

Records an error/exception on the current span with optional additional context.

try {
  // Your code
} catch (error) {
  Hny.recordException(error, {
    "additional.context": "value",
  });
}

addSpanEvent(message, attributes)

Adds an event to the current span with optional attributes.

Hny.addSpanEvent("cache.miss", {
  "cache.key": "user-123",
});

activeSpanContext()

Returns the context of the currently active span, if any.

const context = Hny.activeSpanContext();
// Object { traceId: "412d3ebf30d017fa0ff993677f261b63", spanId: "13dde362233fa22d", traceFlags: 1, traceState: undefined }

inChildSpan(tracerName, spanName, parentContext, fn)

Creates a new span as a child of a specific parent span context.

const parentSpan = Hny.inSpan("tracer", "parent", (span) => span);
Hny.inChildSpan("tracer", "child-operation", parentSpan.spanContext(), () => {
  // Child span code here
});

Examples

See hny.js for the code.

See index.html for an example of use; but you'll change the script tag that brings it in, because that one expects hny.js locally.

Development

Change something in otel.js,npm install, and npm run build. This builds a parcel target defined in package.json. The output goes to dist/hny.js.

To test, change index.html and then run npm run futz to copy it to dist and serve it. Load the page, and then check the dev tools. Network tab should show hits to /v1/traces.

which won't work until you run a collector.

Run a local collector

Set your Honeycomb API key as an environment variable:

export HONEYCOMB_API_KEY=your_api_key_here

Start Docker, then run:

./run-collector

Publish a new version

Update the version in package.json and README.md.

npm publish --access public

it'll prompt for login. Remember, you are jessitronica (and Empress of software).