diff --git a/docs/404.md b/docs/404.md index 32bd784adb..6f543d3e74 100644 --- a/docs/404.md +++ b/docs/404.md @@ -1,11 +1,14 @@ --- -title: "Not Found" +title: "Page not found" layout: "layouts/page.vto" permalink: "404.html" +robots: "noindex" +lead: "The page you were looking for doesn't exist. It may have moved, or the link may be out of date." --- -Sorry, but the page you were trying to view does not exist. -It looks like this was the result of either: +Here are a few places to try instead: -- a mistyped address -- an out-of-date link +- [Home](/) +- [Features](/tour/) +- [Documentation](/docs/) +- [News](/news/) diff --git a/docs/_config.ts b/docs/_config.ts index 20f2af36dc..83bb665532 100644 --- a/docs/_config.ts +++ b/docs/_config.ts @@ -1,8 +1,7 @@ import lume from "lume/mod.ts" import codeHighlight from "lume/plugins/code_highlight.ts" -import picture from "lume/plugins/picture.ts" -import transformImages from "lume/plugins/transform_images.ts" -import { docsNavHtml, siteDataJson } from "./scripts/site-collections.ts" +import { docsBreadcrumbs, docsNavHtml, siteDataJson } from "./scripts/site-collections.ts" +import { defaultSocialImage, structuredData } from "./scripts/structured-data.ts" const site = lume({ src: ".", @@ -30,12 +29,6 @@ site.ignore( ) site.use(codeHighlight()) -site.use(picture()) -site.use(transformImages()) -site.add("public/assets/img/dashboard-2-1024x594.png", "assets/img/dashboard-2-1024x594.png") -site.add("public/assets/img/toexceptionless.png", "assets/img/toexceptionless.png") -site.add("public/assets/img/logs-2.jpg", "assets/img/logs-2.jpg") -site.add("public/assets/img/slider-github.jpg", "assets/img/slider-github.jpg") site.hooks.markdownIt((markdownIt: any) => { const defaultHeadingOpen = markdownIt.renderer.rules.heading_open ?? @@ -58,16 +51,156 @@ site.hooks.markdownIt((markdownIt: any) => { return defaultHeadingOpen(tokens, index, options, env, self) } + + const defaultImage = markdownIt.renderer.rules.image + markdownIt.renderer.rules.image = ( + tokens: any[], + index: number, + options: unknown, + env: Record, + self: any, + ) => { + const token = tokens[index] + const name = token.attrGet("src")?.match(/^\/assets\/img\/docs\/(.+)-light\.webp$/)?.[1] + return name ? docsShot(name, token.content) : defaultImage(tokens, index, options, env, self) + } +}) + +site.preprocess([".md"], (pages) => { + for (const page of pages) { + if (!page.data.description && typeof page.data.content === "string") { + page.data.description = markdownExcerpt(page.data.content) + } + } }) site.data("docsNavHtml", docsNavHtml) +site.data("docsBreadcrumbs", docsBreadcrumbs) +site.data("structuredData", structuredData) +site.data("defaultSocialImage", defaultSocialImage) site.data("siteDataJson", siteDataJson) site.data("copyrightYear", new Date().getFullYear()) site.data("exceptionlessClientScriptSrc", exceptionlessClientScriptSrc()) site.data("siteAssetVersionQuery", siteAssetVersionQuery()) +site.data("productShot", productShot) export default site +type ProductShotOptions = { + eager?: boolean + frame?: boolean + path?: string + sizes?: string +} + +const productShotSizes: Record = { + stacks: [1440, 900], + errors: [1440, 900], + mcp: [1184, 769], +} + +/** Renders a light/dark product screenshot pair from public/assets/img/product with lightbox support. */ +function productShot(name: string, alt: string, options: ProductShotOptions = {}): string { + const [width, height] = productShotSizes[name] ?? [1184, 839] + const sizes = options.sizes ?? "(max-width: 960px) 100vw, 680px" + const loading = options.eager ? 'fetchpriority="high" decoding="async"' : 'loading="lazy" decoding="async"' + const images = ["light", "dark"].map((scheme) => { + const base = `/assets/img/product/${name}-${scheme}` + return `${
+      escapeAttribute(alt)
+    }` + }).join("") + + const button = `` + + if (!options.frame) { + return button + } + + return `
${button}
` +} + +/** + * Renders a docs screenshot written as ![alt](/assets/img/docs/name-light.webp) as a light/dark pair with lightbox + * support. Each screenshot needs name-light, name-dark, and @2x variants of both in public/assets/img/docs. + */ +function docsShot(name: string, alt: string): string { + const [width, height] = webpSize(`public/assets/img/docs/${name}-light.webp`) + const images = ["light", "dark"].map((scheme) => { + const base = `/assets/img/docs/${name}-${scheme}` + return `${
+      escapeAttribute(alt)
+    }` + }).join("") + + return `` +} + +/** Reads the pixel size of a lossy, lossless, or extended WebP image. */ +function webpSize(path: string): [number, number] { + const bytes = Deno.readFileSync(path) + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength) + const chunk = new TextDecoder().decode(bytes.subarray(12, 16)) + if (chunk === "VP8X") { + return [1 + (view.getUint32(24, true) & 0xffffff), 1 + (view.getUint32(27, true) & 0xffffff)] + } + + if (chunk === "VP8L") { + const bits = view.getUint32(21, true) + return [1 + (bits & 0x3fff), 1 + ((bits >> 14) & 0x3fff)] + } + + return [view.getUint16(26, true) & 0x3fff, view.getUint16(28, true) & 0x3fff] +} + +/** Builds a meta description from the first substantial paragraph of a Markdown page. */ +function markdownExcerpt(markdown: string, maxLength = 160): string | undefined { + const paragraphs = markdown + .replace(/```[\s\S]*?```/g, "") + .split(/\r?\n\s*\r?\n/) + .map((block) => + block + .replace(/<[^>]+>/g, " ") + .replace(/!\[[^\]]*\]\([^)]*\)/g, "") + .replace(/\[([^\]]*)\]\([^)]*\)/g, "$1") + .replace(/[*_`>#|]/g, "") + .replace(/\s+/g, " ") + .trim() + ) + .filter((text) => text.length >= 60 && !/^[-+:]/.test(text)) + + const text = paragraphs[0] + if (!text) { + return undefined + } + + if (text.length <= maxLength) { + return text + } + + const clipped = text.slice(0, maxLength - 1) + const sentenceEnd = clipped.lastIndexOf(". ") + if (sentenceEnd >= 80) { + return clipped.slice(0, sentenceEnd + 1) + } + + return `${clipped.slice(0, clipped.lastIndexOf(" ")).replace(/[,;:]$/, "")}…` +} + +function escapeAttribute(value: string): string { + return value.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<") +} + function siteAssetVersionQuery(): string { const version = (Deno.env.get("EXCEPTIONLESS_SITE_VERSION") ?? "").trim() return version ? `?v=${encodeURIComponent(version)}` : "" diff --git a/docs/_data/icons.json b/docs/_data/icons.json new file mode 100644 index 0000000000..05687207b1 --- /dev/null +++ b/docs/_data/icons.json @@ -0,0 +1,82 @@ +{ + "activity": "", + "ai-sparkle": "", + "arrow-right": "", + "arrow-up-right": "", + "badge-check": "", + "bell": "", + "book-open": "", + "bookmark": "", + "bug": "", + "chart-column": "", + "check": "", + "chevron-down": "", + "chevron-right": "", + "circle-check": "", + "circle-x": "", + "clock": "", + "cloud": "", + "code": "", + "command": "", + "container": "", + "copy": "", + "database": "", + "exie": "", + "external-link": "", + "eye-off": "", + "file-code": "", + "file-text": "", + "flag": "", + "gauge": "", + "gift": "", + "git-branch": "", + "github": "", + "globe": "", + "hard-drive": "", + "hash": "", + "heart-handshake": "", + "history": "", + "infinity": "", + "keyboard": "", + "layers": "", + "layout-dashboard": "", + "link": "", + "list-filter": "", + "lock": "", + "mail": "", + "map-pin": "", + "menu": "", + "message-square": "", + "minus": "", + "monitor": "", + "moon": "", + "mouse-pointer-click": "", + "newspaper": "", + "package": "", + "plug": "", + "quote": "", + "radio": "", + "rocket": "", + "rotate-ccw": "", + "rss": "", + "scale": "", + "scroll-text": "", + "search": "", + "server": "", + "settings-2": "", + "shield-check": "", + "slack": "", + "sliders-horizontal": "", + "smartphone": "", + "star": "", + "sun": "", + "tag": "", + "terminal": "", + "timer": "", + "users": "", + "users-round": "", + "webhook": "", + "wifi-off": "", + "x": "", + "zap": "" +} diff --git a/docs/_data/plans.json b/docs/_data/plans.json new file mode 100644 index 0000000000..68d8faa956 --- /dev/null +++ b/docs/_data/plans.json @@ -0,0 +1,32 @@ +[ + { + "name": "Free", + "monthlyPrice": 0, + "description": "3,000 events per month, 3 days of retention, 1 project and 1 user, and the MCP server." + }, + { + "name": "Small", + "monthlyPrice": 15, + "description": "15,000 events per month, 30 days of retention, 5 projects and 10 users, and the MCP server." + }, + { + "name": "Medium", + "monthlyPrice": 49, + "description": "75,000 events per month, 90 days of retention, 15 projects and 25 users, the Exie AI assistant, and the MCP server." + }, + { + "name": "Large", + "monthlyPrice": 99, + "description": "250,000 events per month, 180 days of retention, unlimited projects and users, the Exie AI assistant, and the MCP server." + }, + { + "name": "Extra Large", + "monthlyPrice": 199, + "description": "1,000,000 events per month, 180 days of retention, unlimited projects and users, the Exie AI assistant, and the MCP server." + }, + { + "name": "Enterprise", + "monthlyPrice": 499, + "description": "3,000,000 events per month, 180 days of retention, unlimited projects and users, the Exie AI assistant, and the MCP server." + } +] diff --git a/docs/_data/site.json b/docs/_data/site.json index 240b47a7ee..ac77250356 100644 --- a/docs/_data/site.json +++ b/docs/_data/site.json @@ -1,10 +1,11 @@ { "url": "https://exceptionless.com", "title": "Exceptionless", - "description": "Real-time exception reporting for ASP.NET, Web API, WebForms, WPF, Console, and MVC applications. Includes event organization, notifications, and more.", + "description": "Open source error monitoring for .NET, JavaScript, and React Native with AI built in. Exceptionless groups errors into stacks, alerts you about new and regressed issues, and lets Exie or your AI coding agent help fix them. Hosted or self-hosted.", "author": "Exceptionless Team", "twitter": "@Exceptionless", "signupUrl": "https://be.exceptionless.io/signup?domain=exceptionless.com&type=organic", "appUrl": "https://be.exceptionless.io", - "githubUrl": "https://github.com/exceptionless/Exceptionless" -} \ No newline at end of file + "githubUrl": "https://github.com/exceptionless/Exceptionless", + "githubStars": "2.5k" +} diff --git a/docs/_includes/layouts/base.vto b/docs/_includes/layouts/base.vto index 58ef8005d8..8c329d0a8d 100644 --- a/docs/_includes/layouts/base.vto +++ b/docs/_includes/layouts/base.vto @@ -2,95 +2,134 @@ - - + + + -{{ title ? title + " - Exceptionless" : "Exceptionless" }} + {{ set pageTitle = url === "/" ? (metaTitle || "Exceptionless") : (metaTitle || title || "Exceptionless") + " - Exceptionless" }} + {{ set socialImage = image || defaultSocialImage }} + {{ pageTitle }} - - - + + + + + - + - - - - - + + + + + + + {{ if !image }} + + {{ /if }} - - - - - - + + + + + + - + + {{ if url.startsWith("/docs/") }}{{ /if }} + {{ structuredData(page.data, search) }} + + + + + + + + - - + + +
{{ content }}
- - + + + + + +

+
+ {{ if exceptionlessClientScriptSrc }} {{ /if }} - - {{ for script of extraScripts || [] }} - - {{ /for }} + {{ for script of extraModuleScripts || [] }} {{ /for }} diff --git a/docs/_includes/layouts/docs.vto b/docs/_includes/layouts/docs.vto index c46a968b0b..6d252c8479 100644 --- a/docs/_includes/layouts/docs.vto +++ b/docs/_includes/layouts/docs.vto @@ -1,29 +1,77 @@ --- layout: layouts/base.vto +bodyClass: layout-docs --- - +
+ + -
-
-
-
- - {{ docsNavHtml(search, url) }} +
+
+ +
-
+ {{ set crumbs = docsBreadcrumbs(search, url).slice(1, -1) }} + {{ if crumbs.length }} + + {{ /if }} +
{{ content }} -
+
+ +
diff --git a/docs/_includes/layouts/page.vto b/docs/_includes/layouts/page.vto index f9fd774110..da5be54c0e 100644 --- a/docs/_includes/layouts/page.vto +++ b/docs/_includes/layouts/page.vto @@ -1,16 +1,15 @@ --- layout: layouts/base.vto --- - +
+
+

{{ title }}

+ {{ if lead }}

{{ lead }}

{{ /if }} +
+
-
-
-
-
- {{ content }} -
-
+
+
+ {{ content }}
-
\ No newline at end of file +
diff --git a/docs/_includes/layouts/post.vto b/docs/_includes/layouts/post.vto index 0a307efc06..3d129f7c70 100644 --- a/docs/_includes/layouts/post.vto +++ b/docs/_includes/layouts/post.vto @@ -1,21 +1,19 @@ --- layout: layouts/base.vto +bodyClass: layout-post --- - - -
-
-
-
-
-

{{ title }}

-
-
- {{ content }} -
-
+
+
+ {{ icons["arrow-right"] }} All news +

{{ title }}

+ {{ if author }}{{ /if }} +
+
+
+ {{ content }}
+
+
+ {{ include "partials/signup-banner.vto" { cta: "news-post", title: "Catch errors before your users do", text: "Errors, logs, and feature usage from your .NET, JavaScript, and React Native apps, grouped and ready to fix. Set up in minutes, no credit card required." } }}
diff --git a/docs/_includes/partials/exie-says.vto b/docs/_includes/partials/exie-says.vto new file mode 100644 index 0000000000..55df07b54e --- /dev/null +++ b/docs/_includes/partials/exie-says.vto @@ -0,0 +1,7 @@ +
+ +
+ Exie{{ icons["ai-sparkle"] }} +

{{ text }}

+
+
diff --git a/docs/_includes/partials/signup-banner.vto b/docs/_includes/partials/signup-banner.vto new file mode 100644 index 0000000000..b77045e10d --- /dev/null +++ b/docs/_includes/partials/signup-banner.vto @@ -0,0 +1,10 @@ + diff --git a/docs/about.md b/docs/about.md index 12ce8e4747..3bb8a1a8ad 100644 --- a/docs/about.md +++ b/docs/about.md @@ -1,19 +1,24 @@ --- -title: "About Us" +title: "About Exceptionless" layout: "layouts/page.vto" +description: "Exceptionless is an independent, open source error monitoring company founded in 2013." +lead: "An independent team building developer tools that help you find and fix errors faster." --- -![Exceptionless Logo](/assets/img/exceptionless-logoBLK-300x75.png) +Exceptionless is a privately held software company, established in 2013, specializing in tools that help developers fight errors in their apps. The name says it all: *exceptionless* means **to be without exception**. -Exceptionless is a privately-held software company, established in 2013, specializing in the creation of software tools that help developers fight errors within their apps. +## Open from the start -Company Vision --------------- +We open sourced Exceptionless in 2014, and the hosted service still runs the same code you'll find [on GitHub](https://github.com/exceptionless/Exceptionless). Along the way we've built and shared other open source projects like [Foundatio](https://github.com/FoundatioFx/Foundatio), the building blocks behind Exceptionless's queues, caching, jobs, and storage. -Our goal is to build the best developer tools available to help developers around the world get their jobs done faster and more efficiently. +## Our vision -Mission -------- +Build the best developer tools available, so developers around the world can get their jobs done faster and more efficiently. -We believe in being open and available to our customers, and listening to what they have to say. Our highest priority is the success of our customers, -followed by continued innovation with our products. +## Our mission + +We believe in being open and available to our customers and listening to what they have to say. Our highest priority is the success of our customers, followed closely by continued innovation in our products. + +## Get in touch + +There are real people behind Exceptionless. If you have a question or suggestion, no matter how small, message us from **Help → Support** in the app, start a [GitHub Discussion](https://github.com/exceptionless/Exceptionless/discussions), or [open an issue](https://github.com/exceptionless/Exceptionless/issues). You can also [send us a message](/contact/). diff --git a/docs/ai.vto b/docs/ai.vto new file mode 100644 index 0000000000..22fb43b493 --- /dev/null +++ b/docs/ai.vto @@ -0,0 +1,264 @@ +--- +title: AI error monitoring +metaTitle: "AI error monitoring: Exie assistant and MCP server" +layout: layouts/base.vto +description: Exceptionless brings AI to error monitoring. Ask Exie about production errors, or connect Claude Code, Codex, or GitHub Copilot through the MCP server. +--- +
+
+

{{ icons["ai-sparkle"] }} AI in Exceptionless

+

Error monitoring built for the age of AI agents{{ icons["ai-sparkle"] }}

+

Exie investigates errors with you inside Exceptionless. The MCP server hands the same production context to the coding agent writing your fix. Both work from real stack traces and events, with your permissions.

+ +
+
+ +
+ +
+ +
+
+
+
+

{{ icons["ai-sparkle"] }} Meet Exie

+

An assistant that actually knows your errors

+ {{ include "partials/exie-says.vto" { text: "I read stack traces so you don't have to at 2 a.m. Ask me what's broken, what changed, or what to fix first, and I'll show you what I found." } }} +

Open Ask Exie from anywhere in the app, or press Fix on a stack. Exie picks up the organization, project, stack, or event you are looking at and investigates with the same tools you use.

+
    +
  • {{ icons.check }}Triage: "What are my top issues this week?" or "What changed after version 1.0.2?"
  • +
  • {{ icons.check }}Root cause: explanations grounded in your stack traces, requests, and environment data, with links back to every stack it mentions.
  • +
  • {{ icons.check }}Up front about limits: when the data can't answer a question, Exie says so and tells you what it could find.
  • +
  • {{ icons.check }}Acts only on request: mark a stack fixed in a version, snooze it, flag it critical, or attach an issue link, only when you ask for that change.
  • +
  • {{ icons.check }}Your access, nothing more: Exie works inside the current organization and only sees what your account can see.
  • +
+

Exie is included with Medium plans and up, with a monthly AI usage allowance. Self-hosted installs can enable it with their own model provider key.

+
+
+ {{ productShot("exie", "Exie answering which errors affected the most users this week") }} +
+
+
+
+ +
+
+
+
+

{{ icons.plug }} MCP server

+

Production errors, inside your coding agent

+

The Model Context Protocol lets AI coding agents call tools. Add the Exceptionless MCP server, approve access in your browser, and your agent can find the error, read the stack trace and request that caused it, then write the fix and mark the stack fixed.

+
    +
  • {{ icons.check }}Hosted endpoint: https://be.exceptionless.io/mcp over streamable HTTP.
  • +
  • {{ icons.check }}OAuth sign-in: no API keys to paste into config files.
  • +
  • {{ icons.check }}Works with your tools: setup commands for Claude Code, Codex, GitHub Copilot CLI, and OpenCode.
  • +
  • {{ icons.check }}On every plan: included with all plans, including Free, at no extra cost.
  • +
+
+
+
+ +
> Find recent errors for order 98213 and fix the cause.
+
+● exceptionless.search_events
+● exceptionless.get_event
+● exceptionless.get_stack
+
+The order failed with a TimeoutException in PaymentClient.
+Charge: the gateway call has no retry and a 5 second
+timeout. I added a retry with backoff and a test.
+
+> Mark that stack fixed in 2.8.1.
+
+● exceptionless.update_stack_status
+Stack marked fixed in 2.8.1.
+
+
+
+ +
+

Set up in under a minute

+

Run the command for your agent, then approve access when the browser opens. You choose which organizations it can use.

+
+ +
+
+ + + + +
+
+
claude mcp add --transport http exceptionless https://be.exceptionless.io/mcp
+claude mcp login exceptionless
+
+ + + +
+ +
+
+ +
+
+
+

{{ icons["shield-check"] }} Safe by design

+

AI that only does what you approve

+

Giving an AI access to production data should not mean giving up control. Exie and the MCP server share the same guardrails.

+
+
+
+ {{ icons.lock }} +

Scoped OAuth access

+

Agents sign in with OAuth and PKCE. You pick the organizations and permissions at approval time, and access tokens expire after an hour.

+
+
+ {{ icons["eye-off"] }} +

Read-only if you want

+

Leave the Stacks Write permission unchecked and your agent can investigate but never change anything.

+
+
+ {{ icons["rotate-ccw"] }} +

Revoke anytime

+

See every connected application under your account and revoke one with a click. Leaving an organization removes its access too.

+
+
+ {{ icons.layers }} +

Narrow write actions

+

Changes are limited to stack status, snoozing, critical flags, and reference links. Write tools are marked so your agent can ask before using them.

+
+
+ {{ icons["shield-check"] }} +

Prompt-injection aware

+

Event messages and payloads are treated as untrusted data, so instructions hidden in an error message are not followed.

+
+
+ {{ icons.github }} +

Open source

+

The MCP server and Exie ship in the same Apache 2.0 codebase as the rest of Exceptionless, so you can read exactly what they do.

+
+
+
+
+ +
+
+
+
+

{{ icons["book-open"] }} Agent-ready documentation

+

Docs your assistant can actually read

+

When your AI tool sets up Exceptionless or answers a question about it, it should read the real documentation, not guess. Every page is published in formats language models handle well.

+
    +
  • {{ icons.check }}/llms.txt indexes every docs page with a short summary.
  • +
  • {{ icons.check }}/llms-full.txt contains the complete documentation in one file.
  • +
  • {{ icons.check }}Any docs URL works as Markdown: add .md, like /docs/getting-started.md.
  • +
  • {{ icons.check }}Every docs page has Copy page as Markdown, Open in ChatGPT, and Open in Claude buttons.
  • +
+
+
+
+ +
# Exceptionless
+
+> Open source error monitoring for .NET,
+> JavaScript, and React Native...
+
+## Docs: .NET client
+
+- [Configuration](.../configuration.md)
+- [Sending Events](.../sending-events.md)
+- [Troubleshooting](.../troubleshooting.md)
+
+## Docs: AI
+
+- [MCP server](.../docs/ai/mcp-server.md)
+
+
+
+
+
+ +
+
+
+

AI questions, answered

+
+
+
+ What is Exie? {{ icons["chevron-down"] }} +
Exie is the AI assistant built into Exceptionless. It answers questions about your errors in plain English by searching stacks, reading events, and explaining the likely cause, and it can update a stack when you explicitly ask it to.
+
+
+ Which plans include Exie? {{ icons["chevron-down"] }} +
Exie is included with Medium, Large, Extra Large, and Enterprise plans, each with a monthly AI usage allowance. Self-hosted installs can enable Exie by configuring their own model provider API key.
+
+
+ What is the Exceptionless MCP server? {{ icons["chevron-down"] }} +
It is a Model Context Protocol server at https://be.exceptionless.io/mcp that gives AI coding agents tools to search stacks and events, read event details, count events over time, and, with your permission, update stacks.
+
+
+ Is the MCP server included in my plan? {{ icons["chevron-down"] }} +
Yes. The MCP server is included with every plan, including Free. Agent requests work like any other API access, so there is nothing extra to buy.
+
+
+ Which AI coding agents work with Exceptionless? {{ icons["chevron-down"] }} +
The app gives copy-paste setup commands for Claude Code, Codex, GitHub Copilot CLI, and OpenCode. Other MCP clients that support remote streamable HTTP servers with OAuth sign-in can connect with the same URL.
+
+
+ Can an AI agent change or delete my data? {{ icons["chevron-down"] }} +
Agents can only change stack status, snooze stacks, mark them critical, and add or remove reference links, and only if you grant the Stacks Write permission. They cannot delete events, projects, or organizations.
+
+
+ What data does Exie send to the AI model? {{ icons["chevron-down"] }} +
Your question, recent messages in the conversation, the page you are on, and the stack and event details Exie looks up to answer. Large event payloads are truncated before they are sent.
+
+
+ Does the MCP server work with self-hosted Exceptionless? {{ icons["chevron-down"] }} +
Yes. The MCP server is part of the Exceptionless web app, so a self-hosted install serves it at /mcp on your own domain. See the MCP server guide for details.
+
+
+
+
+ +
+
+
+

Give your AI the context to fix it

+

Create an account, send your first errors, and connect Exie or your coding agent in minutes.

+ +
+
+
diff --git a/docs/contact.vto b/docs/contact.vto index 5ddb8f3133..532af1514c 100644 --- a/docs/contact.vto +++ b/docs/contact.vto @@ -1,49 +1,71 @@ --- -title: Contact Us -layout: layouts/page.vto -description: Contact the Exceptionless team. +title: Contact +layout: layouts/base.vto +description: Contact the Exceptionless team, or get help through in-app support, GitHub Discussions, and GitHub Issues. --- -
-

Questions about hosted plans, self-hosting, support, or partnerships? Send the Exceptionless team a message.

+
+
+

{{ icons["message-square"] }} Contact

+

Talk to the people who build it

+

Questions about hosted plans, self-hosting, support, or partnerships? Send us a message and the Exceptionless team will get back to you.

+
+
-
-
-
- - +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
-
- - -
-
-
` + ``` ## Production stack traces diff --git a/docs/docs/clients/javascript/javascript-example.md b/docs/docs/clients/javascript/javascript-example.md index 5e86954a13..b1f50f94a6 100644 --- a/docs/docs/clients/javascript/javascript-example.md +++ b/docs/docs/clients/javascript/javascript-example.md @@ -1,5 +1,7 @@ --- title: "JavaScript Example" +metaTitle: "Exceptionless JavaScript example apps" +description: "Clone the Exceptionless.JavaScript GitHub repository to run example apps for the browser and JavaScript frameworks, or use them as a starting point." --- # JavaScript Example @@ -7,6 +9,7 @@ title: "JavaScript Example" We have put together an example for a few JavaScript-based frameworks and the browser to help you get started. You can find those [here in the GitHub Repo](https://github.com/exceptionless/Exceptionless.JavaScript/tree/master/example). You can clone the repository and run the code as is or you can use the repository example as a starting point. For framework specific details, continue on to the next page or select a specific framework on the left. + --- [Next > React Example](/docs/clients/javascript/react-example) diff --git a/docs/docs/clients/javascript/node-example.md b/docs/docs/clients/javascript/node-example.md index 9396b49a1f..d509725625 100644 --- a/docs/docs/clients/javascript/node-example.md +++ b/docs/docs/clients/javascript/node-example.md @@ -1,5 +1,7 @@ --- title: "Node.js Example" +metaTitle: "Exceptionless Node.js example" +description: "A minimal Node.js script that imports @exceptionless/node, starts the Exceptionless client with your API key, and submits a caught exception." --- # Node.js Example diff --git a/docs/docs/clients/javascript/react-example.md b/docs/docs/clients/javascript/react-example.md index f86dc4bf6f..3aed661a5d 100644 --- a/docs/docs/clients/javascript/react-example.md +++ b/docs/docs/clients/javascript/react-example.md @@ -1,5 +1,7 @@ --- title: "React Example" +metaTitle: "React error boundary example for Exceptionless" +description: "Report React rendering errors to Exceptionless by wrapping your root component in ExceptionlessErrorBoundary, with an optional custom fallback UI." --- # React Example diff --git a/docs/docs/clients/javascript/sending-events.md b/docs/docs/clients/javascript/sending-events.md index a185d88308..194a57960c 100644 --- a/docs/docs/clients/javascript/sending-events.md +++ b/docs/docs/clients/javascript/sending-events.md @@ -1,5 +1,7 @@ --- title: "Sending Events" +metaTitle: "Sending events from JavaScript" +description: "Send logs, feature usage, 404s, custom events, and caught errors from the Exceptionless JavaScript client, and attach tags, properties, and user identity." order: 4 --- @@ -28,7 +30,7 @@ await Exceptionless.submitNotFound('/somepage'); await Exceptionless.createNotFound('/somepage').addTags('Exceptionless').submit(); // Submit a custom event type -await Exceptionless.submitEvent({ message = 'Low Fuel', type = 'racecar', source = 'Fuel System' }); +await Exceptionless.submitEvent({ message: 'Low Fuel', type: 'racecar', source: 'Fuel System' }); ``` ### Manually Sending Errors diff --git a/docs/docs/clients/javascript/troubleshooting.md b/docs/docs/clients/javascript/troubleshooting.md index d81d6c6a6f..e1bf591c96 100644 --- a/docs/docs/clients/javascript/troubleshooting.md +++ b/docs/docs/clients/javascript/troubleshooting.md @@ -1,5 +1,7 @@ --- title: "Troubleshooting" +metaTitle: "Troubleshooting the JavaScript client" +description: "Fix Exceptionless JavaScript client events that are not sent: update the client, process the queue before exit, enable debug logging, and check your API key." order: 6 --- diff --git a/docs/docs/clients/javascript/vue-example.md b/docs/docs/clients/javascript/vue-example.md index 99ed3598a5..44911e2bde 100644 --- a/docs/docs/clients/javascript/vue-example.md +++ b/docs/docs/clients/javascript/vue-example.md @@ -1,5 +1,7 @@ --- title: "Vue Example" +metaTitle: "Exceptionless Vue example app" +description: "Find the Exceptionless Vue sample app in the Exceptionless.JavaScript GitHub repository to see error reporting wired into a working Vue application." --- # Vue Example diff --git a/docs/docs/comparison.md b/docs/docs/comparison.md index e22d97cdec..0941527bf1 100644 --- a/docs/docs/comparison.md +++ b/docs/docs/comparison.md @@ -1,5 +1,7 @@ --- title: "Comparison" +metaTitle: "Exceptionless vs Application Insights, Elmah, Raygun" +description: "Compare Exceptionless with Application Insights, Elmah, and Raygun on open source, free self-hosting, stacking, search, sessions, webhooks, and REST API." --- # Comparison diff --git a/docs/docs/deduplication.md b/docs/docs/deduplication.md index 9e5f7d6853..c1f999459e 100644 --- a/docs/docs/deduplication.md +++ b/docs/docs/deduplication.md @@ -1,5 +1,6 @@ --- title: "Event De-Duplication" +description: "Learn how Exceptionless de-duplicates identical events within a minute, holding repeats for 60 seconds and counting them so floods do not use up plan limits." --- # Event De-Duplication diff --git a/docs/docs/demo-formatting.md b/docs/docs/demo-formatting.md index a7e08d96fa..7c551ab2a9 100644 --- a/docs/docs/demo-formatting.md +++ b/docs/docs/demo-formatting.md @@ -1,5 +1,6 @@ --- title: "Markdown Formatting Demo" +description: "Internal demo of the Markdown formatting available in Exceptionless docs and blog posts: footnotes, anchors, attributes, spans, alerts, and tables." hidden: true url: false --- diff --git a/docs/docs/filtering-and-searching.md b/docs/docs/filtering-and-searching.md index c0a31d4ff4..8fbfe50a52 100644 --- a/docs/docs/filtering-and-searching.md +++ b/docs/docs/filtering-and-searching.md @@ -1,63 +1,89 @@ --- title: "Filtering & Searching" +metaTitle: "Filtering and searching events in Exceptionless" +description: "Search and filter Exceptionless events by fields like tag, type, level, version, or user, with AND/OR queries, wildcards, exclusions, and date ranges." --- # Filtering & Searching -- [Filter by Organization \& Project](#filter-by-organization--project) +- [Views](#views) - [Filter by Time Frame](#filter-by-time-frame) - [Filter by Environment](#filter-by-environment) -- [Filter / Search by Specific Criteria](#filter--search-by-specific-criteria) -- [Searchable Fields \& Requirements](#searchable-fields--requirements) +- [Add Filters](#add-filters) +- [Search with a Raw Filter](#search-with-a-raw-filter) +- [Save a View](#save-a-view) +- [Searchable Fields & Requirements](#searchable-fields--requirements) - [Multiple Queries](#multiple-queries) - [Wild Cards](#wild-cards) - [Exclusions](#exclusions) - [Set and Unset Fields](#set-and-unset-fields) - [Ranges](#ranges) - [Custom Extended Data](#custom-extended-data) -- [Demo Video](#demo-video) -## Filter by Organization & Project +## Views -The dashboard loads up with all projects selected by default. +Every list in Exceptionless is a view, and each view owns its filters. There is no global project or time filter. Pick a view from the sidebar under **Stacks**, **Events**, or **Sessions**, for example **Stacks > All**, **Stacks > Most Frequent Errors**, or **Events > Errors**. -Click on the “All Projects” drop down in the top left of the dashboard and select your organization or project to filter the data to your liking. +The filter bar at the top of the view shows the view name, the date range, and any filters that are applied. Changing a filter only changes the view you are looking at. -![Exceptionless Filter Project Organization](img/filter-by-project-organization.png) +![Stacks view filtered by project, tag, and date range](/assets/img/docs/filtering-and-searching-filtered-view-light.webp) ## Filter by Time Frame -Click on the calendar icon in the header to select from multiple preset time frame filters, or click "Custom" and select your own. +Click the **Date** filter to change the time frame. Pick a preset, such as **Last 24 hours** or **Last 7 days**, or expand **Custom range** and enter a start and end. Custom values accept a year (`2024`), month (`2024-01`), day (`2024-01-01`), a timestamp, or a relative time such as `now-1h`. Click **Apply** to use the custom range. -![Exceptionless Filter Time Frame](img/filter-by-timeframe.png) +You can also drag across the chart to zoom into a time range. + +![Date range picker with presets and a custom range](/assets/img/docs/filtering-and-searching-date-range-light.webp) ## Filter by Environment Choose **Manage filters → Environment** to select production, staging, development, or a custom name. Select **Unspecified** for events without this property, or clear the selection to include all environments. See [Environments](/docs/environments/) for client configuration and shared stack behavior. -## Filter / Search by Specific Criteria +## Add Filters + +Click the **+** button next to the filters (it reads **Filter** when the view has none) to add a filter. Type in the search box to find a field, then pick it. Common choices are **Project**, **Status**, **Tag**, **Type**, **Log Level**, **Message**, **User**, and **Version**, and you can filter on many more fields, such as browser, OS, machine name, IP address, location, and error type. + +Each filter shows up as a button in the filter bar. Click it to change its value. The buttons at the bottom of a filter let you clear the value, hide the filter, or remove it. + +![Add filter menu listing the fields you can filter by](/assets/img/docs/filtering-and-searching-add-filter-light.webp) + +Some views include hidden filters. For example, **Stacks > All** has a hidden **Status** filter that only shows open and regressed stacks. The number on the **+** button is the count of hidden filters. Open the menu and click the eye icon to show them, or the eraser icon to clear all filters. + +You can also add filters from an event or stack. Click the filter icon next to a value, such as the type, source, or version, or click a tag, to filter the view by it. + +## Search with a Raw Filter -Click the magnifying glass to search by specific criteria. +To search with the query syntax described below, add a **Raw Filter**. Open the **+** menu and pick **Raw Filter**, or type your query in the menu's search box and choose **Create Raw Filter**. Press Enter to apply it, or Escape to cancel. The **?** button opens this page. -You can filter by tag, ID, organization, project, stack, type, value, IP, architecture, user, and much more. +![Raw filter with a query using OR and an exclusion](/assets/img/docs/filtering-and-searching-raw-filter-light.webp) -Some searches, such as ID, require a prefix (“id:”) on the search, but others, such as error.message, can be entered as strings (“A NullReferenceException occurred”). +Raw filters are combined with the date range and the other filters in the view. -View a complete list of searchable terms, examples, and FAQs below. +You can also press `/` to open the command menu and search events and stacks from anywhere in the app. -![Exceptionless Filter Search Criteria Field](img/filter-by-search-filter-criteria.png) +## Save a View + +When you change a view's filters, a dot appears on the **View** button to show you have unsaved changes. Open the **View** menu to: + +- **Save** your changes to the current view. +- **Save As...** to create a new view. Give it a name and choose whether it is **Private** (only visible to you). The new view shows up in the sidebar. +- **Reset to Saved** to discard your changes. +- **Set as my home view** to open this view when you open Exceptionless. + +![View menu with options to save, reset, and set a home view](/assets/img/docs/filtering-and-searching-save-view-light.webp) ## Searchable Fields & Requirements | TERM | EXAMPLE | FIELD REQUIRED? (field:term) | DESCRIPTION | | ------------------ | -------------------------------------------------------------------------------------------------------------------- | ---------------------------- | --------------------------------------------- | -| `*` | `*` | false | Shows all events (including hidden and fixed) | +| `*` | `*` | false | Matches everything. Status filters still apply | | id | `id:54d8315ce6bb2d0500bcc7b4` | true | Documents id | | organization | `organization:54d8315ce6bb2d0500bcc7b4` | true | Organization id | | project | `project:54d8315ce6bb2d0500bcc7b4` | true | Project id | | stack | `stack:54d8315ce6bb2d0500bcc7b4` | true | Stack id | | reference | `reference:12345678` | true | Reference id | -| session | `session:12345678` | true | Session id | +| ref.session | `ref.session:12345678` | true | Session id | | environment | `environment:production` or `_missing_:environment` | true | Deployment environment | | type | `type:error` | true | Event type | | source | `source:"my log source"` or `"my log source"` | false | Event source | @@ -70,8 +96,8 @@ View a complete list of searchable terms, examples, and FAQs below. | geo | `geo:75044~75mi` or `geo:[geohash1..geohash2]` | true | Geo Location | | status | `status:open` or `status:discarded` or `status:fixed` or `status:regressed` or `status:snoozed` or `status:ignored` | true | Stack status | | version | `version:1` or `version:1.0` or `version:1.0.0` | true | Application version | -| machine | `machine:Server` or `Server` | false | Machine name | -| ip | `ip:127.0.0.1` or `127.0.0.1` | false | IP address | +| machine | `machine:Server` | true | Machine name | +| ip | `ip:127.0.0.1` | true | IP address | | architecture | `architecture:x64` | true | Machine architecture | | useragent | `useragent:IE` or `useragent:"Mozilla/5.0"` | true | User Agent | | path | `path:"/cart"` or `"/cart"` | false | URL path | @@ -82,22 +108,28 @@ View a complete list of searchable terms, examples, and FAQs below. | os | `os:iOS` | true | Operating System | | os.version | `os.version:8.0` | true | Operating System version | | os.major | `os.major:8` | true | Operating System major version | +| count | `count:>5` | true | Number of occurrences the event represents | +| client.version | `client.version:4.0.0` | true | Exceptionless client version | +| cmd | `cmd:"MyApp.exe --run"` | true | Command line | +| country | `country:US` | true | Country | +| level1 | `level1:TX` | true | Region | +| level2 | `level2:Dallas` | true | City | | bot | `bot:true` | true | bot | | error.code | `error.code:500` or `500` | false | Error code | -| error.message | `error.message:"A NullReferenceException occurred"` or `"A NullReferenceException occurred"` | false | Error message | +| error.message | `error.message:"A NullReferenceException occurred"` | true | Error message | | error.type | `error.type:"System.NullReferenceException"` or `"System.NullReferenceException"` | false | Error type | | error.targettype | `error.targettype:"System.NullReferenceException"` or `"System.NullReferenceException"` | false | Error target type | | error.targetmethod | `error.targetmethod:AssociateWithCurrentThread` or `AssociateWithCurrentThread` | false | Error target method | | user | `user:"random user identifier"` or `"random user identifier"` | false | Uniquely identifies user | -| user.name | `user:"Exceptionless User"` or `"Exceptionless User"` | false | Friendly name of user | +| user.name | `user.name:"Exceptionless User"` or `"Exceptionless User"` | false | Friendly name of user | | user.description | `user.description:"I clicked the button"` or `"I clicked the button"` | false | User Description | -| user.email | `user.email:"support@exceptionless.io"` or `"support@exceptionless.io"` | false | User Email Address | +| user.email | `user.email:"support@exceptionless.io"` or `"support@exceptionless.io"` | false | User email address (the user identity) | ## Multiple Queries All queries separated by a space will be an `AND` operation. If you wish to `OR` queries you’ll need to use an `OR` statement. We recommend wrapping conditional statements with parentheses. -**Example:** Lets assume we want to return all events that have a `blue` or `red` tag. To search for these events our query would be `(tag:blue OR tag:red)`. +**Example:** Let's assume we want to return all events that have a `blue` or `red` tag. To search for these events our query would be `(tag:blue OR tag:red)`. ## Wild Cards @@ -107,34 +139,28 @@ Suffix your query with `*` for wild card searches. Prefix the field name with `-` for exclusions. -**Example:** Lets assume that we want to return all events that are not marked as a bot. To search for these events our query would be `-bot:true`. +**Example:** Let's assume that we want to return all events that are not marked as a bot. To search for these events our query would be `-bot:true`. *NOTE: In some cases searching with `-bot:true` is more accurate than searching with `bot:false`. This happens because the first query returns all records where `bot` field is `not set` or `not equal to true`. The second query returns results only where the `bot` field is set to `false`. ## Set and Unset Fields Prefix the field name with `_missing_` or `_exists_`. -**Example:** Lets assume that we want to return all events that do not contain any tags. To search for these events our query would be `_missing_:tag`. +**Example:** Let's assume that we want to return all events that do not contain any tags. To search for these events our query would be `_missing_:tag`. ## Ranges Specify a `date` or `numeric` range as part of the term. -**Date Range Example:** Lets assume that we want to return all events that occurred in 2020. To search for these events our query would be `date:[2020-01-01 TO 2020-12-31]`. +**Date Range Example:** Let's assume that we want to return all events that occurred in 2020. To search for these events our query would be `date:[2020-01-01 TO 2020-12-31]`. -**Numeric Range Example:** Lets assume that we want to return all events that contain contain a `value` between 1 and 10. To search for these events our query would be `value:(>0 AND <=10)`. +**Numeric Range Example:** Let's assume that we want to return all events that contain a `value` between 1 and 10. To search for these events our query would be `value:(>0 AND <=10)`. ## Custom Extended Data -All simple data types (`string`, `boolean`, `date`, `number`) that are stored in extended data will be indexed. _NOTE_: Field names will be lowercased and escaped. Any field name that is not a valid identifier (containing only letter and digits) or is longer than 25 characters will be ignored. - -**Example:** Lets assume that our events extended data contains a property called `Age` with a value of `18`. To search for this value our query would be `data.age:18`. - -*** - -## Demo Video +All simple data types (`string`, `boolean`, `date`, `number`) that are stored in extended data will be indexed. _NOTE_: Field names are lowercased. Any field name that contains characters other than letters, digits, and hyphens, or is longer than 25 characters, is not indexed. - +**Example:** Let's assume that our events extended data contains a property called `Age` with a value of `18`. To search for this value our query would be `data.age:18`. --- diff --git a/docs/docs/getting-started.md b/docs/docs/getting-started.md index 3cc9232ab3..99f68ce0da 100644 --- a/docs/docs/getting-started.md +++ b/docs/docs/getting-started.md @@ -1,5 +1,7 @@ --- title: "Getting Started" +metaTitle: "Getting started with Exceptionless" +description: "Get started with Exceptionless: create a hosted account and project or self-host, configure a client for your app, and send a first error event with curl." --- # Getting Started diff --git a/docs/docs/img/DataExclusions.png b/docs/docs/img/DataExclusions.png deleted file mode 100644 index 2088dab39e..0000000000 Binary files a/docs/docs/img/DataExclusions.png and /dev/null differ diff --git a/docs/docs/img/Manual_Key.png b/docs/docs/img/Manual_Key.png deleted file mode 100644 index a0c3f5fc0c..0000000000 Binary files a/docs/docs/img/Manual_Key.png and /dev/null differ diff --git a/docs/docs/img/Most_Frequent.png b/docs/docs/img/Most_Frequent.png deleted file mode 100644 index 738d45739d..0000000000 Binary files a/docs/docs/img/Most_Frequent.png and /dev/null differ diff --git a/docs/docs/img/Options.png b/docs/docs/img/Options.png deleted file mode 100644 index 53194f564e..0000000000 Binary files a/docs/docs/img/Options.png and /dev/null differ diff --git a/docs/docs/img/Spam_Detection.png b/docs/docs/img/Spam_Detection.png deleted file mode 100644 index ca6e8d0a7f..0000000000 Binary files a/docs/docs/img/Spam_Detection.png and /dev/null differ diff --git a/docs/docs/img/Stack_Details.png b/docs/docs/img/Stack_Details.png deleted file mode 100644 index c278da8c06..0000000000 Binary files a/docs/docs/img/Stack_Details.png and /dev/null differ diff --git a/docs/docs/img/Status_Options.png b/docs/docs/img/Status_Options.png deleted file mode 100644 index 15dc3eed04..0000000000 Binary files a/docs/docs/img/Status_Options.png and /dev/null differ diff --git a/docs/docs/img/apiKeyGeneration.png b/docs/docs/img/apiKeyGeneration.png deleted file mode 100644 index d78561ffbb..0000000000 Binary files a/docs/docs/img/apiKeyGeneration.png and /dev/null differ diff --git a/docs/docs/img/apikeys.png b/docs/docs/img/apikeys.png deleted file mode 100644 index 003b106ca0..0000000000 Binary files a/docs/docs/img/apikeys.png and /dev/null differ diff --git a/docs/docs/img/bulk-actions-video-screenshot.png b/docs/docs/img/bulk-actions-video-screenshot.png deleted file mode 100644 index a7a0a9a2ba..0000000000 Binary files a/docs/docs/img/bulk-actions-video-screenshot.png and /dev/null differ diff --git a/docs/docs/img/dashboard-nav.jpg b/docs/docs/img/dashboard-nav.jpg deleted file mode 100644 index ed651db3ca..0000000000 Binary files a/docs/docs/img/dashboard-nav.jpg and /dev/null differ diff --git a/docs/docs/img/default_log_levels.png b/docs/docs/img/default_log_levels.png deleted file mode 100644 index 308506fb5e..0000000000 Binary files a/docs/docs/img/default_log_levels.png and /dev/null differ diff --git a/docs/docs/img/email-notification-settings.png b/docs/docs/img/email-notification-settings.png deleted file mode 100644 index 3f8565737a..0000000000 Binary files a/docs/docs/img/email-notification-settings.png and /dev/null differ diff --git a/docs/docs/img/exceptionless-bulk-actions.gif b/docs/docs/img/exceptionless-bulk-actions.gif deleted file mode 100644 index 1be04ada8b..0000000000 Binary files a/docs/docs/img/exceptionless-bulk-actions.gif and /dev/null differ diff --git a/docs/docs/img/exceptionless-slack-settings.png b/docs/docs/img/exceptionless-slack-settings.png deleted file mode 100644 index 7f46387e9e..0000000000 Binary files a/docs/docs/img/exceptionless-slack-settings.png and /dev/null differ diff --git a/docs/docs/img/exceptionless_webhooks.png b/docs/docs/img/exceptionless_webhooks.png deleted file mode 100644 index 02a6e39840..0000000000 Binary files a/docs/docs/img/exceptionless_webhooks.png and /dev/null differ diff --git a/docs/docs/img/exceptionless_zapier.png b/docs/docs/img/exceptionless_zapier.png deleted file mode 100644 index 711c0ca976..0000000000 Binary files a/docs/docs/img/exceptionless_zapier.png and /dev/null differ diff --git a/docs/docs/img/filter-by-project-organization.png b/docs/docs/img/filter-by-project-organization.png deleted file mode 100644 index 6670514be1..0000000000 Binary files a/docs/docs/img/filter-by-project-organization.png and /dev/null differ diff --git a/docs/docs/img/filter-by-search-filter-criteria.png b/docs/docs/img/filter-by-search-filter-criteria.png deleted file mode 100644 index a682dcb6d1..0000000000 Binary files a/docs/docs/img/filter-by-search-filter-criteria.png and /dev/null differ diff --git a/docs/docs/img/filter-by-timeframe.png b/docs/docs/img/filter-by-timeframe.png deleted file mode 100644 index e8e5e29c5b..0000000000 Binary files a/docs/docs/img/filter-by-timeframe.png and /dev/null differ diff --git a/docs/docs/img/integrations.png b/docs/docs/img/integrations.png deleted file mode 100644 index 814e4cb786..0000000000 Binary files a/docs/docs/img/integrations.png and /dev/null differ diff --git a/docs/docs/img/logdetails.png b/docs/docs/img/logdetails.png deleted file mode 100644 index 2291a22afb..0000000000 Binary files a/docs/docs/img/logdetails.png and /dev/null differ diff --git a/docs/docs/img/logleveldashboard.png b/docs/docs/img/logleveldashboard.png deleted file mode 100644 index afc9c68638..0000000000 Binary files a/docs/docs/img/logleveldashboard.png and /dev/null differ diff --git a/docs/docs/img/logmessageevents.png b/docs/docs/img/logmessageevents.png deleted file mode 100644 index dba3d7f130..0000000000 Binary files a/docs/docs/img/logmessageevents.png and /dev/null differ diff --git a/docs/docs/img/logstack.png b/docs/docs/img/logstack.png deleted file mode 100644 index 58c06c4c1f..0000000000 Binary files a/docs/docs/img/logstack.png and /dev/null differ diff --git a/docs/docs/img/newstacks.png b/docs/docs/img/newstacks.png deleted file mode 100644 index 26897405a9..0000000000 Binary files a/docs/docs/img/newstacks.png and /dev/null differ diff --git a/docs/docs/img/override.png b/docs/docs/img/override.png deleted file mode 100644 index 6a2d429cbf..0000000000 Binary files a/docs/docs/img/override.png and /dev/null differ diff --git a/docs/docs/img/project-settings.png b/docs/docs/img/project-settings.png deleted file mode 100644 index ed1f086e1d..0000000000 Binary files a/docs/docs/img/project-settings.png and /dev/null differ diff --git a/docs/docs/img/sessions-event-tab-user-footsteps.jpg b/docs/docs/img/sessions-event-tab-user-footsteps.jpg deleted file mode 100644 index 383d443344..0000000000 Binary files a/docs/docs/img/sessions-event-tab-user-footsteps.jpg and /dev/null differ diff --git a/docs/docs/img/versioning.png b/docs/docs/img/versioning.png deleted file mode 100644 index e8a359522f..0000000000 Binary files a/docs/docs/img/versioning.png and /dev/null differ diff --git a/docs/docs/index.md b/docs/docs/index.md index f6b90ebc51..c0cb7899e0 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,8 +1,10 @@ --- title: "Overview" +metaTitle: "Exceptionless documentation" +description: "Exceptionless documentation for real-time error reporting in JavaScript, Node.js, ASP.NET Core, and .NET apps, configurable without redeploying." --- -# Index +# Exceptionless documentation The definition of the word exceptionless is: to be without exception. Exceptionless provides real-time error reporting for your JavaScript, Node, .NET Core, ASP.NET, Web API, WebForms, WPF, Console, and MVC apps. It organizes the gathered information into simple actionable data that will help your app become exceptionless! diff --git a/docs/docs/integrations.md b/docs/docs/integrations.md index 5e43c46485..f6f3806ff8 100644 --- a/docs/docs/integrations.md +++ b/docs/docs/integrations.md @@ -1,12 +1,14 @@ --- title: "Integrations" +metaTitle: "Exceptionless integrations: Slack, Zapier, webhooks" +description: "Connect Exceptionless to Slack, Zapier, and webhooks from project settings, pick which notifications to send, and see the webhook JSON payload." --- # Integrations -To make managing events from your application easier, Exceptionless provides some useful integrations. You can access these integrations by clicking the Project dropdown menu, clicking the settings icon next to the project name, then clicking on the Integrations tab on the Settings page. +To make managing events from your application easier, Exceptionless provides some useful integrations. To find them, go to **Settings** > **Projects** in the sidebar, click your project, then click the **Integrations** tab. -![Integrations Page Screenshot](./img/integrations.png) +![Integrations tab in project settings](/assets/img/docs/integrations-overview-light.webp) We provide three integrations: @@ -16,21 +18,26 @@ We provide three integrations: ## Zapier -Exceptionless has built a [first-class Zapier application](https://zapier.com/apps/exceptionless/integrations) that allows you to connect your Exceptionless account to over 3,000 other apps. To use this, simply sign into your Zapier account and search for Exceptionless. - -![Zapier page for Exceptionless](./img/exceptionless_zapier.png) +Exceptionless has built a [first-class Zapier application](https://zapier.com/apps/exceptionless/integrations) that allows you to connect your Exceptionless account to over 3,000 other apps. Click **Connect Zapier** on the Integrations tab to open the Exceptionless app on Zapier, or sign into your Zapier account and search for Exceptionless. ## Slack -Connecting to Slack is as simple as clicking the Slack integration button. You'll be prompted to sign into your Slack workspace. Once signed in, you can choose the channel for your notifications to be sent to. Then, back on the Settings page, you can configure what types of notifications are sent. - -![Slack integration example](./img/exceptionless-slack-settings.png) +Connecting to Slack is as simple as clicking the **Connect Slack** button. You'll be prompted to sign into your Slack workspace. Once signed in, you can choose the channel for your notifications to be sent to. Then, back on the Integrations tab, use the switches to choose which notifications are sent: **New Errors**, **Critical Errors**, **Error Regressions**, **New Events**, and **Critical Events**. To disconnect, click **Remove Slack**. ## Webhooks -By configuring a webhook, you are telling Exceptionless to post data to the specified endpoint whenever specific events happen. This is useful in creating custom, bespoke integrations for your Exceptionless account. Configuring a webhook is simple. Click the Add Webhook button on the Settins page and provide the information requested in the modal. +By configuring a webhook, you are telling Exceptionless to post data to the specified endpoint whenever specific events happen. This is useful in creating custom, bespoke integrations for your Exceptionless account. Configuring a webhook is simple. Click the **+** (Add Webhook) button in the **Webhooks** section of the Integrations tab, enter the **URL** to call, choose the **Event Types** that should trigger it, and click **Add Webhook**. + +![Add New Webhook dialog with a URL and event types selected](/assets/img/docs/integrations-add-webhook-light.webp) + +You can choose from these event types: -![Webhooks example](./img/exceptionless_webhooks.png) +- **New Error**: a new error that has never been seen before is reported to your project. +- **Critical Error**: an error that has been marked as critical is reported to your project. +- **Regression**: an event that has been marked as fixed has reoccurred in your project. +- **New Event**: a new event that has never been seen before is reported to your project. +- **Critical Event**: an event that has been marked as critical is reported to your project. +- **Promoted**: a stack is promoted to external systems. Here's an example of the event payload (this applies to v2 of the Exceptionless API): diff --git a/docs/docs/managing-stacks.md b/docs/docs/managing-stacks.md index f448d33ee3..9ad51d0086 100644 --- a/docs/docs/managing-stacks.md +++ b/docs/docs/managing-stacks.md @@ -1,5 +1,6 @@ --- title: "Managing Stacks" +description: "Manage Exceptionless stacks: view stack details, mark them Open, Fixed, Snoozed, Ignored, or Discarded, flag future occurrences critical, and add links." --- # Managing Stacks @@ -10,25 +11,25 @@ But what is a stack, exactly? It's pretty simple, actually. A stack is an automa ### Viewing Stacks -Now, let's take a look at how you manage these stacks. When you first sign in, you'll be taken to your dashboard on the Most Frequent view. +Now, let's take a look at how you manage these stacks. When you sign in, you land on the Stacks list. The **Stacks** menu in the sidebar has saved views for common lists: **All**, **Most Frequent 404s**, **Most Frequent Errors**, and **Most Used Features**. The Most Frequent views sort stacks by how many events they received. -![Most Frequent view of stacks on dashboard](img/Most_Frequent.png) +![Most Frequent Errors view of the Stacks list](/assets/img/docs/managing-stacks-list-light.webp) -Click on a stack you'd like to manage (We recommend you start with the most frequent event because that's probably pretty annoying for your customers 😉). Clicking on a stack will take you to a detailed view that includes important information such as how many times the event occurred, the number of users impacted, and the first and last occurrences of the event. +Click on a stack you'd like to manage (We recommend you start with the most frequent event because that's probably pretty annoying for your customers 😉). Clicking on a stack opens its details in a side panel, and the panel's **Open in new window** button opens the full stack page. The details include important information such as how many times the event occurred, the percentage of users affected, and the first and last occurrences of the event. Below the stack summary, you can page through the individual events in the stack. -![Stack Details Example](img/Stack_Details.png) +![Stack details showing total events, users affected, and first and last occurrence](/assets/img/docs/managing-stacks-details-light.webp) ### Applying Statuses -To apply a status on a stack, click the dropdown in the top-right and apply the appropriate selection. Selection options include: +To apply a status on a stack, click the status button in the top-right corner of the stack details (it shows the current status, such as **Open**) and pick a new status. The options are: * Open * Fixed -* Snoozed +* Snoozed (choose 6 Hours, 1 Day, 1 Week, or 1 Month) * Ignored * Discarded -![Status Options Example](img/Status_Options.png) +![Stack status menu with Open, Fixed, Snoozed, Ignored, and Discarded](/assets/img/docs/managing-stacks-status-menu-light.webp) Marking the status of a stack will control your [filtering](/docs/filtering-and-searching) options, but it can also drive your workflow. Ignored stacks may be stacks you have no plans of addressing. Discarded stacks (which do not count against your plan quota) may be stacks that you can't easily prevent from coming through but you don't want to see and don't care about. Snoozing stacks allows you to be reminded at a future point to address the stack in question. @@ -36,25 +37,31 @@ Let's take a look at each status in detail: **Open** - This status indicates that the error is new or actively occurring. You will receive email notifications for these issues. -**Fixed** - Well, this one means you fixed it. If you look at Exceptionless as your todo list for errors, marking a stack as "Fixed" is like checking an item off your todo list. To be more specific, you won't get notifications if you have marked events as fixed. You will have the opportunity to provide your software's version number in which the fix was introduced. If another error comes through of the same kind and it matches the version number that was supposed to fix the issue, your stacks will be marked as "Regressed" instead of "Fixed". Additionally, if you mark a stack as Fixed but do not supply a version number in which it was fixed, should the event happen again, the stack will be marked as "Regressed". +**Fixed** - Well, this one means you fixed it. If you look at Exceptionless as your todo list for errors, marking a stack as "Fixed" is like checking an item off your todo list. To be more specific, you won't get notifications if you have marked events as fixed. When you choose Fixed, you can optionally enter the [version](/docs/versioning) of your software in which the fix was introduced. If another error comes through of the same kind and it matches the version number that was supposed to fix the issue, your stacks will be marked as "Regressed" instead of "Fixed". Additionally, if you mark a stack as Fixed but do not supply a version number in which it was fixed, should the event happen again, the stack will be marked as "Regressed". -**Snoozed** - Marking a stack as snoozed means you will not get email notifications for whatever period of time you indicate. This is like your alarm clock in the morning. You know you need to take action (like wake up or fix the bug), but you really don't want to yet. Snooze has your back. After the specified period of time, the stacks will once again start alerting you. +**Snoozed** - Marking a stack as snoozed hides it from your stack lists and means you will not get email notifications for whatever period of time you indicate. This is like your alarm clock in the morning. You know you need to take action (like wake up or fix the bug), but you really don't want to yet. Snooze has your back. After the specified period of time, the stacks will once again start alerting you. **Ignored** - When you ignore a stack, you will no longer receive email notifications unless you change the status. You may choose to do this when you have no intentions of resolving the issue but still want to collect information from the stacks. -**Discarded** - You should use this status when you do not care about the event at all. If "Ignored" is turning your back on an event and trying not to see it, "Discarded" is putting its feet in cement and dropping it into the middle of a lake. And since these events are sleeping with the fishes, they don't count against your plan quota. +**Discarded** - You should use this status when you do not care about the event at all. If "Ignored" is turning your back on an event and trying not to see it, "Discarded" is putting its feet in cement and dropping it into the middle of a lake. And since these events are sleeping with the fishes, they don't count against your plan quota. You'll be asked to confirm before a stack is discarded. Beyond statuses, you have options to further control your stacks. ### Additional Options -![Options Examples](img/Options.png) +Click the gear button next to the status button to open the **Stack Options** menu. -Marking a stack with "Future Occurrences are Critical" will automatically tag all subsequent events that come into that stack with the critical tag and will make them more prominent for you to review. +![Stack Options menu with Future Occurrences Are Critical, Promote To External, Add Reference Link, View Stacking Information, and Delete](/assets/img/docs/managing-stacks-options-menu-light.webp) -The "Promote to External" option allows you to send the stack details to an external source that you've configured through webhooks in the [Integrations](/docs/integrations) section. This can help you automate issue tracking and project management. For example, you can use this functionality to connect to [Zapier](https://zapier.com), a no-code automation tool. By doing so, you can automatically funnel events from Exceptionless to issues on Github or Jira. You can send text alerts to your devops team (just be smart about this one because those folks need sleep too!), or you can use the data from Exceptionless to build custom dashboards for your entire organization. +Marking a stack with "Future Occurrences Are Critical" will automatically tag all subsequent events that come into that stack with the critical tag and will make them more prominent for you to review. -Adding a "Reference Link" allows you to supply to a link from an external source. This is helpful when a customer files a Github issue, for example. You can link to Github or to a Slack conversation, or anywhere, really. +The "Promote To External" option allows you to send the stack details to an external source that you've configured as a promoted webhook in the [Integrations](/docs/integrations) section. If the project has no promoted webhook yet, Exceptionless offers to take you to the project's integrations. This can help you automate issue tracking and project management. For example, you can use this functionality to connect to [Zapier](https://zapier.com), a no-code automation tool. By doing so, you can automatically funnel events from Exceptionless to issues on Github or Jira. You can send text alerts to your devops team (just be smart about this one because those folks need sleep too!), or you can use the data from Exceptionless to build custom dashboards for your entire organization. + +"Add Reference Link" allows you to attach a link to an external source. This is helpful when a customer files a GitHub issue, for example. You can link to GitHub or to a Slack conversation, or anywhere, really. Reference links are listed in the stack details. + +"View Stacking Information" shows the values Exceptionless used to group events into the stack. This is handy when you want to understand why two events did or didn't land in the same stack. + +"Delete" removes the stack and its events. You'll be asked to confirm first. Managing your stacks is the core focus within Exceptionless, and we try to automate as much as possible for you. However, it is possible to manually stack events, allowing you some of the same management tools outlined here. diff --git a/docs/docs/manual-stacking.md b/docs/docs/manual-stacking.md index 24fb8b5e3a..24f8147998 100644 --- a/docs/docs/manual-stacking.md +++ b/docs/docs/manual-stacking.md @@ -1,5 +1,6 @@ --- title: "Manual Stacking" +description: "Group related Exceptionless events into a custom stack with a manual stacking key, with examples for the REST API, the .NET client, and JavaScript." --- # Manual Stacking @@ -10,17 +11,15 @@ How might we do this? You can use the `SetManualStackingKey` method to facilitat ## Creating Custom Stacks -In the below examples, we use `SetManualStackingKey` and are naming the custom stack "MyCustomStackingKey" and setting the value to "ANOTHER FEATURE. What this does is it ensures that any events, regardless of the type or reason for the event, will be grouped together. +In the examples below, the cURL request sets a stacking key named "mystackingkey" to the value "ANOTHER FEATURE" and titles the stack "My stack title". The .NET and JavaScript examples call `SetManualStackingKey("MyCustomStackingKey")`, which stores "MyCustomStackingKey" as the event's `ManualStackingKey` value. Any events that share the same key are grouped into the same stack, regardless of the type or reason for the event. -![Example manual stacking on dashboard](img/Manual_Key.png) - -In the example above, the events grouped under "My stack title" use custom stacking keys to group them together. Let's see how you would do this in practice. +To check which values grouped a stack, open the stack, click the gear button next to the status button, and choose **View Stacking Information**. For a manually stacked event, it lists your stacking key and value. Let's see how you would do this in practice. ## cURL Example ```shell curl --location --request POST 'https://api.exceptionless.com/api/v2/events' \ ---header 'Authorization: Bearer XUlBBdgFxAlmCsAZHDFTIacXpzYuZDuqDzzFYMlR' \ +--header 'Authorization: Bearer YOUR_PROJECT_TOKEN' \ --header 'Content-Type: application/json' \ --data-raw '{ "type": "error", "date":"2030-01-01T12:00:00.0000000-05:00", @@ -30,7 +29,8 @@ curl --location --request POST 'https://api.exceptionless.com/api/v2/events' \ "type": "System.Exception", "stack_trace": " at Client.Tests.ExceptionlessClientTests.CanSubmitSimpleException() in ExceptionlessClientTests cs:line 99" }, - "@stack": { "title": "My stack title", "signature_data": { "mystackingkey": "ANOTHER FEATURE" }} + "@stack": { "title": "My stack title", "signature_data": { "mystackingkey": "ANOTHER FEATURE" } } +}' ``` ## C# Example @@ -52,14 +52,13 @@ event.SetManualStackingKey("MyCustomStackingKey"); ## JavaScript Example ```javascript -var client = exceptionless.ExceptionlessClient.default; -// Node.Js -// var client = require('exceptionless').ExceptionlessClient.default; +import { Exceptionless } from "@exceptionless/browser"; +// For Node.js, import from "@exceptionless/node" instead. try { - throw new Error('Unable to create order from quote.'); + throw new Error("Unable to create order from quote."); } catch (error) { - client.createException(error).setManualStackingKey('MyCustomStackingKey').submit(); + await Exceptionless.createException(error).setManualStackingKey("MyCustomStackingKey").submit(); } ``` diff --git a/docs/docs/notifications.md b/docs/docs/notifications.md index baee42f4ed..f3b3beabc5 100644 --- a/docs/docs/notifications.md +++ b/docs/docs/notifications.md @@ -1,14 +1,18 @@ --- title: "Notifications" +metaTitle: "Exceptionless email notification settings" +description: "Turn on Exceptionless email notifications from the Notifications tab in your account settings, then choose which notifications you get for each project." --- # Notifications -To turn on email notifications, go to "My Account" in your dashboard, then click on the "Notifications" tab. +To turn on email notifications, click your name at the bottom of the sidebar and choose **Notifications**. You can also open **Account** from the same menu and click the **Notifications** tab. -Once you're in there, you can select the project you want to edit notifications to, and then select which notifications you want to receive for that selected project. +Make sure **Enable Email Notifications** is turned on. You must verify your email address before Exceptionless sends you email notifications. -![Email Notifications](img/email-notification-settings.png) +Under **Project Notifications**, select the project you want to edit notifications for, and then turn on the notifications you want to receive for that project: **Daily Project Summary**, **New Errors**, **Critical Errors**, **Error Regressions**, **New Events**, and **Critical Events**. The event notifications require a paid plan. Changes save automatically. + +![Project Notifications settings with the daily summary and event notification switches](/assets/img/docs/notifications-project-settings-light.webp) --- diff --git a/docs/docs/project-settings.md b/docs/docs/project-settings.md index 47ca72a7dd..36ecd7ee26 100644 --- a/docs/docs/project-settings.md +++ b/docs/docs/project-settings.md @@ -1,5 +1,6 @@ --- title: "Project Settings" +description: "Configure Exceptionless project settings: API keys, data exclusions, error stacking, spam detection, client configuration values, and event exclusions." --- # Project Settings @@ -47,19 +48,23 @@ Each client wrapper has its own guide to help you get started. Visit either one Before doing anything, you want to create an API Key for your project. This protects you and your team by ensuring you are using a revokable key. Instead of using a user-scoped key that would provide access to everything, a project-scoped key is limited to—you guessed it—a single project. -To generate an API Key, go to your project settings page and click on the API Keys tab. There, you can click the New API Key button. +To open your project settings, go to **Settings** > **Projects** in the sidebar and click your project. The settings page has tabs for **General**, **API Keys**, **Settings**, **Configuration**, **Integrations**, **Stack Management**, and **Usage**. -![exceptionless api keys](../docs/img/apikeys.png) +To generate an API Key, click the **API Keys** tab, click **Add token**, and choose **Client API key**. The same menu also creates a **Source map upload token** for uploading source maps from CI/CD. + +![API Keys tab with the Add token menu open](/assets/img/docs/project-settings-api-keys-light.webp) ## Data Exclusions Data can be excluded from your error reports by specifying the information you'd like excluded. This is especially important when you are dealing with sensitive information. For example, an error on log in might, by default, send a user's password to our server. You probably don't want that, so you can exclude that type of data from being sent. For more on how we handle security issues, check out our [security page](/docs/security). -To get started, go to your project settings page, click the Settings tab. +To get started, go to your project settings page and click the **Settings** tab. The **Data Exclusions** section is near the top. + +![Data Exclusions section on the project Settings tab](/assets/img/docs/project-settings-data-exclusions-light.webp) -![Settings](img/DataExclusions.png) +Enter a comma delimited list of field names that should be removed from any error report data (e.g., extended data properties, form fields, cookies and query parameters). You can also specify a field name with wildcards `*` to specify starts with, ends with, or contains just to be extra safe. Changes save automatically when you leave the field. -A comma delimited list of field names that should be removed from any error report data (e.g., extended data properties, form fields, cookies and query parameters). Data Exclusions can be configured on the project settings page. You can also specify a field name with wildcards `*` to specify starts with, ends with, or contains just to be extra safe. +Turn on the switch below the field to automatically remove user identifiable information from events, such as the machine name, user information, and IP addresses. ### Example usage @@ -78,13 +83,13 @@ You can also control how errors are stacked by specifying user namespaces (if yo If your app runs on .NET or other languages that support namespaces, you can define what namespaces your code runs in. This allows Exceptionless to pick a stacking target within your code. -You can set this up on the project settings page in the Settings tab. You simply need to provide, a comma delimited list of the namespace names that your applications code belongs to. If this value is set, only methods inside of these namespaces will be considered as stacking targets. +You can set this up on the project settings page in the **Settings** tab, under **Error Stacking** > **User Namespaces**. You simply need to provide a comma delimited list of the namespace names that your applications code belongs to. If this value is set, only methods inside of these namespaces will be considered as stacking targets. ### Common Methods Slightly different from your namespace definitions above, defining common methods here will *exclude* stacks from building up for specified methods. This is important as you may have catch-all methods in your code or specific methods that you expect to have frequent errors you'd rather not pass to Exceptionless. -You can set this up on the project settings page in the Settings tab. Simply supply a comma delimited list of common method names that should not be used as stacking targets. +You can set this up on the project settings page in the **Settings** tab, under **Error Stacking** > **Common Methods**. Simply supply a comma delimited list of common method names that should not be used as stacking targets. --- @@ -92,13 +97,13 @@ You can set this up on the project settings page in the Settings tab. Simply sup Spam detection allows you to prevent noise from being tracked. Bots crawling your site or app can contribute to stacks that you simply do not want to see or track. We make it easy to filter these out. -On your project settings page, click the Settings tab and scroll down to the Spam Detection section. There, you can also specify a comma delimited list of user agents that should be ignored client side. This list supports wildcards and by default covers a vast major of bots. +On your project settings page, click the **Settings** tab and scroll down to the **Spam Detection** section. There, you can specify a comma delimited list of user agents that should be ignored client side. This list supports wildcards and by default covers a vast majority of bots. -### Automatic Spam Detection +![Spam Detection section on the project Settings tab](/assets/img/docs/project-settings-spam-detection-light.webp) -![Automatic Spam Filtering](img/Spam_Detection.png) +### Automatic Spam Detection -We also provide you with a simple tool to automatically detect spam from a single IP address sending in a high volume of activity. Click the checkbox, and we will do the rest. +We also provide you with a simple tool to automatically detect spam from a single IP address sending in a high volume of activity. Turn on the switch below the user agent list, and we will automatically hide high volumes of events coming from a single client IP address. --- @@ -106,9 +111,9 @@ We also provide you with a simple tool to automatically detect spam from a singl Custom client configuration values allow you to control the behavior of your app in real time. They are a dictionary of key value pairs (string key, string value). Usage examples include controlling data exclusions to protecting sensitive data and or enabling/disabling features. -To set up custom client configurations, click the All Projects drop down in the navigation header when you are signed into Exceptionless. Then, hover over your project name and you'll see a gear icon. Click that icon. This will take you to your project settings screen where you can click the tab called Client Configuration. +To set up custom client configurations, go to **Settings** > **Projects** in the sidebar and click your project. On the project settings page, click the **Configuration** tab. Click the **+** (Add Configuration Value) button, enter a **Key** and **Value**, and click **Add Configuration Value**. -![Exceptionless Project Settings](img/project-settings.png) +![Configuration tab listing a project's client configuration values](/assets/img/docs/project-settings-configuration-light.webp) Once you have made changes to your Project Settings, the configuration values will only be read by your client if your client is aware of the configuration. This happens out of the box with the [Exceptionless .NET Client](/docs/clients/dotnet/) and the [Exceptionless JS Client](/docs/clients/javascript/). If you are building your own client or simply wrapping our API, you can still make use of these configuration values by reading them in periodically via a `GET` request to `/api/v2/projects/{id}/config`. diff --git a/docs/docs/references-ids.md b/docs/docs/references-ids.md index cbdede6123..53a5669a4b 100644 --- a/docs/docs/references-ids.md +++ b/docs/docs/references-ids.md @@ -1,5 +1,6 @@ --- title: "Reference Ids" +description: "Use Exceptionless reference IDs to look up submitted events: enable UseReferenceIds in .NET, show the last reference ID to users, and search by it." --- # Reference Ids @@ -44,8 +45,10 @@ ExceptionlessClient.Default.GetLastReferenceId(); ### JavaScript Last Reference Id Example ```javascript +import { Exceptionless } from "@exceptionless/browser"; + // Get the last created Reference Id -exceptionless.ExceptionlessClient.default.getLastReferenceId(); +Exceptionless.getLastReferenceId(); ``` ## Displaying Reference Ids to End Users @@ -106,7 +109,7 @@ Now you'll get a user friendly error response that contains a Reference Id, like ## Looking up Events by Reference Id Link directly to an event by outputting a link in your UI or log files, like -`https://be.exceptionless.io/event/by-ref/YOUR_REFERENCE_ID)` +`https://be.exceptionless.io/event/by-ref/YOUR_REFERENCE_ID` Or you can search via the api/ui with `reference:YOUR_REFERENCE_ID` diff --git a/docs/docs/security.md b/docs/docs/security.md index 5b3947e261..05902e30ac 100644 --- a/docs/docs/security.md +++ b/docs/docs/security.md @@ -1,5 +1,7 @@ --- title: "Security" +metaTitle: "Exceptionless security and data exclusions" +description: "Learn how Exceptionless protects data with SSL and how to use data exclusions with wildcards to remove passwords and other sensitive fields from reports." --- # Security diff --git a/docs/docs/self-hosting/docker.md b/docs/docs/self-hosting/docker.md index 2e277d27da..4d637fdf6a 100644 --- a/docs/docs/self-hosting/docker.md +++ b/docs/docs/self-hosting/docker.md @@ -1,5 +1,7 @@ --- title: "Docker" +metaTitle: "Self-hosting Exceptionless with Docker" +description: "Run self-hosted Exceptionless with Docker: a throwaway test container, a setup with persisted Elasticsearch data, and a setup with SSL and SMTP email." --- # Docker diff --git a/docs/docs/self-hosting/index.md b/docs/docs/self-hosting/index.md index e5c4a801b7..f0ce90a395 100644 --- a/docs/docs/self-hosting/index.md +++ b/docs/docs/self-hosting/index.md @@ -1,5 +1,7 @@ --- title: "Self Hosting" +metaTitle: "Self-hosting Exceptionless overview" +description: "Self-host Exceptionless with Docker or Kubernetes and configure trusted reverse proxies with ForwardedHeaders so client IPs and HTTPS are detected." --- # Self Hosting diff --git a/docs/docs/self-hosting/kubernetes.md b/docs/docs/self-hosting/kubernetes.md index 8c551e28e7..18538b9210 100644 --- a/docs/docs/self-hosting/kubernetes.md +++ b/docs/docs/self-hosting/kubernetes.md @@ -1,7 +1,11 @@ --- title: "Kubernetes" +metaTitle: "Self-hosting Exceptionless on Kubernetes" +description: "Deploy self-hosted Exceptionless on Kubernetes with Helm: EX_ config map values, connection strings, ingress proxy trust, Active Directory, and Slack." --- +# Self-hosting Exceptionless on Kubernetes + Please follow this section to set up Exceptionless in a Kubernetes environment. Please note this section is a work in progress, any contributions is greatly appreciated. ## Requirements @@ -122,7 +126,7 @@ The `provider` value determines what implementations to use for the various abst ## Active Directory Authentication -To enable Active Directory authentication, update the Update the `exceptionless-config` config map to include the `EX_ConnectionStrings__LDAP` connection string. The value should be your domain's LDAP URI (e.g. `LDAP://ad.domain.com/` or `LDAP://ad.domain.com/DC=domain,DC=com`). +To enable Active Directory authentication, update the `exceptionless-config` config map to include the `EX_ConnectionStrings__LDAP` connection string. The value should be your domain's LDAP URI (e.g. `LDAP://ad.domain.com/` or `LDAP://ad.domain.com/DC=domain,DC=com`). Please note the following: diff --git a/docs/docs/self-hosting/upgrading-self-hosted-instance.md b/docs/docs/self-hosting/upgrading-self-hosted-instance.md index efa7d8eaaa..a3bb38952b 100644 --- a/docs/docs/self-hosting/upgrading-self-hosted-instance.md +++ b/docs/docs/self-hosting/upgrading-self-hosted-instance.md @@ -1,5 +1,7 @@ --- title: "Upgrading" +metaTitle: "Upgrading a self-hosted Exceptionless server" +description: "Upgrade a self-hosted Exceptionless server from v1 through v8, including Elasticsearch reindexing, migration jobs, proxy trust changes, and config updates." --- # Upgrading @@ -33,7 +35,7 @@ A rerun does not change the recorded current migration version or the original m ## Upgrading from v7 to v7.1 -We made some changes to email configuration. Yoy wukk now be required to set the `EX_SmtpFrom` config map/environment variable in order to send email. The value should be in the following format: `"Exceptionless "` +We made some changes to email configuration. You will now be required to set the `EX_SmtpFrom` config map/environment variable in order to send email. The value should be in the following format: `"Exceptionless "` ## Upgrading from v6 to v7 @@ -50,12 +52,12 @@ A migration job will need to be run as there are several in place data migration Version 6 added support for Elasticsearch 7, which requires a complete data migration from Elasticsearch 5.x. This tutorial assumes you have docker/Kubernetes installed and have followed the [setup guide](/docs/self-hosting/). -1. Create a new Elasticsearch 7 cluster or modify your existing `docker-compose` file to also include our Elasticsearch 7.x image (There will need to be two Elasticsearch docker instances (5.x and 7.x). Please note that we've included the Elasticsearch major version number in the data path of the docker data path, this allows you to run two versions side by side without losing the data. +1. Create a new Elasticsearch 7 cluster or modify your existing `docker-compose` file to also include our Elasticsearch 7.x image. There will need to be two Elasticsearch docker instances (5.x and 7.x). Please note that we've included the Elasticsearch major version number in the docker data path, which allows you to run two versions side by side without losing the data. 2. Add a new environment variable or config map setting for `EX_ElasticsearchToMigrate` with the value of the `EX_Elasticsearch` 5.x connection string. 3. Add your existing Elasticsearch instance to `reindex.remote.whitelist` in Elasticsearch 7's `elasticsearch.yml`. Make sure you include the port as well, for example `reindex.remote.whitelist: 127.0.0.1:9200`. 4. Update the existing `EX_Elasticsearch` environment variable or config map entry to point to the Elasticsearch 7.x Cluster. 5. Scale down existing Exceptionless apps and jobs. -6. Start the Data Migration by running the `DataMigration` job. You can run it by opening the CLI and executing `dotnet Exceptionless.Job.dll DataMigration`. If you receive a warning that the port is already used, you need to change `ASPNETCORE_URLS` first, for example `ASPNETCORE_URLS=http://+:8080`. You can also run an incremental reindex by setting the `EX_ReindexCutOffDate` with a date value (E.G., `2022-01-28T18:00:00.00Z`., environment variable or config map entry and rerunning the Migration Job. +6. Start the Data Migration by running the `DataMigration` job. You can run it by opening the CLI and executing `dotnet Exceptionless.Job.dll DataMigration`. If you receive a warning that the port is already used, you need to change `ASPNETCORE_URLS` first, for example `ASPNETCORE_URLS=http://+:8080`. You can also run an incremental reindex by setting the `EX_ReindexCutOffDate` environment variable or config map entry to a date value (e.g., `2022-01-28T18:00:00.00Z`) and rerunning the Migration Job. 7. Scale up the rest of the app! ## Upgrading from v4 to v5 diff --git a/docs/docs/setting-log-levels.md b/docs/docs/setting-log-levels.md index 3f8858944e..cf7bcf62aa 100644 --- a/docs/docs/setting-log-levels.md +++ b/docs/docs/setting-log-levels.md @@ -1,46 +1,30 @@ --- title: "Log Levels" +metaTitle: "Setting log levels in Exceptionless" +description: "Set minimum log levels for Exceptionless log events in project settings or per log stack, so clients stop sending lower-level logs without a redeploy." --- # Log Levels Setting log levels allows you to control the flow of data into your Exceptionless account. This is important when you are trying to filter the signal from the noise. In most error monitoring services, you would need to manually configure what log levels are used to send events by customizing your code. With Exceptionless, you can update the log levels used right in the Exceptionless UI. -To configure your default log levels, go to your project settings page by clicking the project name dropdown in the top left of the header. Hover over your project name, then click the gear icon. Once on the project settings page, click the Settings tab. Here, you will see the default log level options. +To configure your default log level, open **Settings > Projects** in the sidebar, click your project, and then open the **Settings** tab. The **Default Log Level** section is at the top. Click the dropdown and pick the lowest level you want to keep. -![Log Level Settings](img/default_log_levels.png) +![Default Log Level dropdown on the project Settings tab](/assets/img/docs/setting-log-levels-project-default-light.webp) -You can change this at the project level or override the setting on the Stacks page. To override the global log level, click on "Log Messages" on the left side of your screen: +You can set the level for the whole project here, or override it for a single log source on that log's stack. To find a log stack, open **Events > Logs** in the sidebar. You can also filter **Stacks > All** or **Events > All** by type. -![Log Levels](./img/logleveldashboard.png) +![The Logs events view](/assets/img/docs/setting-log-levels-logs-view-light.webp) -Next, you'll want to do one of two things: - -### 1. Click on "New Stacks" and then click on the log stack you'd like to change. - -The new stacks tab is on the left under Log Messages: - -![new stacks](./img/newstacks.png) - -When you click that link, you can click on the log stack and it will take you to this page: - -![log stack](./img/logstack.png) - -### 2. You can click on a log message event from the Log Messages -> Events dashboard or the All -> Events dashboard, then you can click on a particular log message and click Go To Stack. - -If you click Events, you'll see all log events (or all events depending on the dashboard you've chosen): - -![log message events](./img/logmessageevents.png) - -Then, click on the event and you'll be taken to a details page for that event where you will see a "Go To Stack" button: - -![log details](./img/logdetails.png) +Click a log event. The event details open with the log's stack card at the top. ### Overriding Global Log Levels -Now, you can override the global log levels for your account. Simply click the log level dropdown, select the new log level setting you'd like to capture in your stacks, and events of the same type or above will be captured, but any log levels below the type selected will no longer be captured. +In the stack card header, click the log level button (the filter icon, first in the row of buttons) and select a new level. Events at that level or above are kept for this log source. Anything below it is no longer captured. The button only appears on log stacks that have a source. + +![Log Level menu on a log stack](/assets/img/docs/setting-log-levels-stack-override-light.webp) -![override](./img/override.png) +Once a stack has its own level, the menu also shows **Default** with the project's level. Click it to remove the override and go back to the project default. As with Data Exclusions, updates to project level and global log level settings will be passed down to the Exceptionless client in near real-time. While the Exceptionless server will catch event that should not be included in your dashboard, the client will catch them based on your configuration and prevent them from ever being sent to the server. Read more about [Project Settings](/docs/project-settings) here. diff --git a/docs/docs/source-maps.md b/docs/docs/source-maps.md index 64f0ede52e..901faa2ee7 100644 --- a/docs/docs/source-maps.md +++ b/docs/docs/source-maps.md @@ -1,5 +1,6 @@ --- title: "JavaScript Source Maps" +description: "Get readable JavaScript stack traces in Exceptionless with source maps: discover public maps automatically or upload private maps from your CI/CD pipeline." --- # JavaScript Source Maps diff --git a/docs/docs/user-sessions.md b/docs/docs/user-sessions.md index f2f827cf3a..31d9943967 100644 --- a/docs/docs/user-sessions.md +++ b/docs/docs/user-sessions.md @@ -1,20 +1,21 @@ --- title: "User Sessions" +description: "Track user sessions in Exceptionless from .NET and JavaScript: set a user identity, enable sessions, send start, heartbeat, and end events, and view reports." --- # User Sessions With user session tracking, you can easily see what a user is doing that leads up to an event occurrence, or just see how they are using your app. -Each session has a list of events (feature usages, exceptions, log messages, etc) that the user triggered. Each can be clicked on to drill down. +Each session has a list of events (feature usages, exceptions, log messages, etc.) that the user triggered. Open any event in the session and click the **Session Events** tab to see them. Click an event to drill down, or use the events button above the list to open the Events view filtered to that session. -![Exceptionless User Session Events](img/sessions-event-tab-user-footsteps.jpg) +![Session Events tab on an event](/assets/img/docs/user-sessions-session-events-light.webp) -Browser and environment information, along with any other data that persists throughout the user session is stored as well. +Browser and environment information, along with any other data that persists throughout the user session, is stored as well. -Once you set up session tracking, you can find the report under Reports > Sessions, or click on the unique session id in any event's overview tab. +Once you set up session tracking, click **Sessions** in the sidebar to see every session in the selected time range, with totals for sessions, users, and average duration. Turn on **View Active** to show only sessions that have not ended. Click a session to open its details. You can also click the session ID on any event's **Overview** tab. -![Exceptionless Sessions Report](img/dashboard-nav.jpg) +![Sessions dashboard](/assets/img/docs/user-sessions-dashboard-light.webp) ## Turn On Session Tracking @@ -30,7 +31,9 @@ ExceptionlessClient.Default.Configuration.SetUserIdentity("UNIQUE_ID_OR_EMAIL_AD ### JavaScript Set User Identity Example ```javascript -exceptionless.ExceptionlessClient.default.config.setUserIdentity('UNIQUE_ID_OR_EMAIL_ADDRESS', 'Display Name'); +import { Exceptionless } from "@exceptionless/browser"; + +Exceptionless.config.setUserIdentity("UNIQUE_ID_OR_EMAIL_ADDRESS", "Display Name"); ``` **Please Note: In WinForms and WPF applications**, a plugin will automatically set the default user to the `Environment.UserName` if the default user hasn’t been already set. Likewise, if you are in a web environment, we will set the default user to the request principal’s identity if the default user hasn’t already been set. @@ -47,7 +50,9 @@ ExceptionlessClient.Default.Configuration.UseSessions(); ### JavaScript Use Sessions Example ```javascript -exceptionless.ExceptionlessClient.default.config.useSessions(); +import { Exceptionless } from "@exceptionless/browser"; + +Exceptionless.config.useSessions(); ``` ## Manually Send SessionStart, SessionEnd, and heartbeat Events @@ -66,9 +71,11 @@ await ExceptionlessClient.Default.SubmitSessionEndAsync(); ### JavaScript Submit Session Events Example ```javascript -exceptionless.ExceptionlessClient.default.submitSessionStart(); -exceptionless.ExceptionlessClient.default.submitSessionHeartbeat(); -exceptionless.ExceptionlessClient.default.submitSessionEnd(); +import { Exceptionless } from "@exceptionless/browser"; + +await Exceptionless.submitSessionStart(); +await Exceptionless.submitSessionHeartbeat(); +await Exceptionless.submitSessionEnd(); ``` ## Disable Heartbeat diff --git a/docs/docs/versioning.md b/docs/docs/versioning.md index 8cf36bd12d..4a0d4a96fd 100644 --- a/docs/docs/versioning.md +++ b/docs/docs/versioning.md @@ -1,5 +1,7 @@ --- title: "Versioning" +metaTitle: "Versioning and regression detection" +description: "Set an application version in Exceptionless so stacks marked fixed in a version reopen as regressed only when a newer version hits the same error." --- # Versioning @@ -23,16 +25,18 @@ An application version will try and be resolved if possible, but it's a good ide ## What does mark fixed do? -![Exceptionless Mark Fixed](img/versioning.png) +To mark a stack fixed, open the stack, click the status button in the top-right corner (it shows the current status, such as **Open**), and choose **Fixed**. You can also select several stacks in a list and choose **Mark Fixed** from the [**Actions**](/docs/bulk-actions) menu. Enter the version that contains the fix in the **Version** box, or leave it empty, and then click **Mark Stack Fixed**. + +![Mark Stack As Fixed dialog with an optional version](/assets/img/docs/versioning-mark-fixed-light.webp) When you mark a stack as fixed, the following meta data is recorded on the stack: * when the stack was fixed * and **optionally** the semantic version that you fixed this behavior in. -> **NOTE:** If you are using a **four-part version number** (E.G., `1.2.3.4`), you'll need to enter it as `1.2.3-4`. We will automatically handle this conversion when processing events. +> **NOTE:** Versions are semantic versions. If you enter a **four-part version number** (E.G., `1.2.3.4`), the dialog changes it to `1.2.3-4` for you, and a two-part version like `1.2` becomes `1.2.0`. We automatically handle four-part versions when processing events. -Next, all stack event occurrences are marked as fixed and will be hidden from all dashboards. You can show fixed events in dashboards by updating the search box with `*` or `fixed:true`. +Next, the stack is hidden from the default stack lists, which only show open and regressed stacks. To see fixed stacks, include **Fixed** in the list's **Status** filter. This meta data is then inspected when an matching event is processed to determine if the stack and all occurrences should be regressed (_marked not fixed_). There are two scenarios where a stack will be marked as regressed: diff --git a/docs/index.vto b/docs/index.vto index ed07bafa08..851e0c48f6 100644 --- a/docs/index.vto +++ b/docs/index.vto @@ -1,206 +1,425 @@ --- title: Home +metaTitle: "Exceptionless: Open source error monitoring with AI built in" layout: layouts/base.vto -description: Real-time exception reporting for ASP.NET, Web API, WebForms, WPF, Console, and MVC applications. Includes event organization, notifications, and more. -extraStyles: - - /assets/cyclone-slider-pro/templates/standard/style.css +bodyClass: layout-home +description: Open source error monitoring for .NET, JavaScript, and React Native with AI built in. Get alerts for new and regressed errors, then fix them with Exie or your coding agent. --- -
-
-
-
-
-
Exceptionless Dashboard
-
-

Don't let your users walk away in frustration

-

Discover errors in your app you never knew were happening and use detailed error reports to - squash them with ease. Make your app Exceptionless!

Sign up for FREE!
-
-
-
-

Exceptionless makes error reporting a breeze

-

Simply install the client and begin collecting unhandled exceptions right away. Use our fluent - API to send additional details about critical errors and be notified immediately.

Take the Tour
-
-
Exceptionless submission code sample
-
-
-
-
-
-
Exceptionless logs tracking
-
-

Report Logs, Feature Usages, and more!

-

You can send any type of event to your Exceptionless dashboard. Create tags for organization, and - you've got a robust event logging system!

Sign up for - FREE!
-
-
-
-

Fork Us! Exceptionless is Open Source

-

Join the community and help us make the software world a better place. Collaborate, give - feedback, report bugs, and host Exceptionless yourself - for free.

Fork Us on GitHub!
-
-
Exceptionless on GitHub
-
-
-
+
+
+
+ + New + A completely redesigned app, with an AI assistant built in + {{ icons["arrow-right"] }} + +

Find and fix errors before your users notice

+

Exceptionless captures exceptions, logs, and feature usage from your .NET, JavaScript, and React Native apps, groups them into stacks, and alerts you the moment something breaks. Then Exie and your AI coding agent help you fix it.

+ +
    +
  • {{ icons["circle-check"] }} No credit card required
  • +
  • {{ icons["circle-check"] }} Open source, no lock-in
  • +
  • {{ icons["circle-check"] }} Set up in minutes
  • +
+
+
+ {{ productShot("stacks", "Exceptionless stacks view showing grouped errors, logs, and event trends", { frame: true, eager: true, path: "/stack/all", sizes: "(max-width: 1200px) 100vw, 1160px" }) }} +
+
+
+ +
+
+
+
+ Since 2013 + Catching production errors +
+
+ {{ site.githubStars }} + Stars on GitHub +
+
+ Apache 2.0 + Open source, no lock-in +
+
+ AI built in{{ icons["ai-sparkle"] }} + Exie assistant and MCP server +
+
+
+
+ +
+
+
+

{{ icons.zap }} Set up in minutes

+

A few lines of code. Every error, organized.

+

Install the client, add your API key, and unhandled exceptions start flowing in. Add context like users, tags, and custom objects whenever you need more detail.

+
    +
  1. Create a projectSign up in seconds. No credit card required.
  2. +
  3. Add the clientOne NuGet or npm package and a single line of startup code.
  4. +
  5. Watch the stacks roll inErrors, logs, 404s, and feature usage, grouped and ready to act on.
  6. +
+ +
+ +
+
+ + + + + +
+
+
// dotnet add package Exceptionless.AspNetCore
+var builder = WebApplication.CreateBuilder(args);
+builder.AddExceptionless();
+
+var app = builder.Build();
+app.UseExceptionHandler();
+app.UseExceptionless();
+
+app.Run();
+

{{ icons["circle-check"] }} Reads your API key from the Exceptionless section of appsettings.json.

+
+ + + + +
+
+
+ +
+
+
+

{{ icons.layers }} From alert to fix

+

Less noise. More fixes.

+

Exceptionless turns a firehose of events into a short, prioritized list, then gives you the context to fix each one quickly.

+
+ +
+
+ {{ icons.layers }} +

Thousands of events. A handful of stacks.

+

Every occurrence is grouped by error type and where it happened in your code, so you work through real problems instead of duplicate alerts.

+
    +
  • {{ icons.check }}Most frequent, newest, and regressed views show you what to fix first.
  • +
  • {{ icons.check }}Mark it fixed in a version and hear about it if it ever comes back.
  • +
  • {{ icons.check }}Snooze, ignore, or mark critical in bulk, right from the list.
  • +
+ How stacking works {{ icons["arrow-right"] }} +
+
+ {{ productShot("most-frequent", "Most frequent errors saved view with occurrence counts and user impact") }} +
+
+ +
+
+ {{ icons["file-code"] }} +

Every detail you would otherwise have to ask for

+

Stop asking users for screenshots and versions. Each event arrives with the stack trace, request, environment, user, and session already attached.

+
    +
  • {{ icons.check }}Full stack traces including inner exceptions and source-mapped JavaScript.
  • +
  • {{ icons.check }}Custom objects like orders or tenants, promotable to their own tabs.
  • +
  • {{ icons.check }}Reference IDs so support can jump straight from a ticket to the error.
  • +
+ See event details {{ icons["arrow-right"] }} +
+
+ {{ productShot("event", "Event details with exception information and a full stack trace") }} +
+
+ + {{ include "partials/signup-banner.vto" { cta: "home-features", title: "Know the moment something breaks", text: "Real-time alerts for new and regressed errors, with the full context to fix them. Set up in minutes, no credit card required.", secondaryHref: "/tour/", secondaryLabel: "Take the tour" } }} +
+
+ +
+
+
+
+

{{ icons["ai-sparkle"] }} Meet Exie

+

Your debugging sidekick, built right in

+ {{ include "partials/exie-says.vto" { text: "Hi, I'm Exie. Tell me what broke and I'll dig through your stacks and events to find out why, then help you fix it." } }} +
    +
  • {{ icons.check }}Knows where you are. Ask "why is this happening?" on a stack and Exie already knows which one you mean.
  • +
  • {{ icons.check }}Shows its work. Exie tells you the time range it looked at and links every stack it mentions.
  • +
  • {{ icons.check }}Hands off until you ask. Exie only marks a stack fixed, snoozes it, or links an issue when you tell it to.
  • +
+ Explore AI in Exceptionless {{ icons["arrow-right"] }} +
+
+ {{ productShot("exie", "Exie answering which errors affected the most users this week") }} +
+
+ +
+
+

{{ icons.plug }} MCP server

+

Bring production errors into your coding agent

+

Connect Claude Code, Codex, GitHub Copilot, or OpenCode to the Exceptionless MCP server. Your agent can search stacks, read events, and pull stack traces while it works on the fix, all through a secure OAuth sign-in. It's included on every plan, including Free.

+
+ Claude Code + Codex + GitHub Copilot + OpenCode
- -
-
- - - -
-
-
- -
Exceptionless Customers & Users
-
Exceptionless Users & Customers
-

What Is Exceptionless?

-
-

The definition of the word exceptionless is: to be without exception. Our product provides real-time error, feature, and log reporting for your ASP.NET, Web API, WebForms, WPF, Console, and MVC apps. It organizes the gathered information into simple actionable data that will help your app become exceptionless. Best of all, it’s open source!

-
    -
  • -
    -
    Error notifications, including critical and regressions
    -
  • -
  • -
    -
    Easily see top errors and prioritize them
    -
  • -
  • - -
    Intelligent grouping of exceptions, logs, and features
    -
  • -
  • -
    -
    Dashboard with event stats and trends
    -
  • -
  • -
    -
    Detailed error reports, including stacktrace
    -
  • -
  • -
    -
    Add any custom objects to your events
    -
  • -
  • -
    -
    Unlimited users per organization
    -
  • -
  • -
    -
    Mark exceptions as fixed, monitor for regressions
    -
  • -
  • -
    -
    Real-time view of events as they happen
    -
  • -
  • -
    -
    Ability to mark events as being critical
    -
  • -
  • -
    -
    Supports offline and occasionally connected scenarios
    -
  • -
  • -
    -
    Easy setup in less than 5 minutes
    -
  • -
-
-

How Does It Work?

-
-
-

1. Create a free account

-

Signup in seconds – No credit card required

-
-
›
-
-

2. Install the client

-

Install the Exceptionless client from NuGet

-
-
›
-
-

3. See your exceptions

-

Done – Start tracking & fixing those exceptions!

-
-
+ Set up the MCP server {{ icons["arrow-right"] }} +
+
+
+ +
$ claude mcp add --transport http exceptionless https://be.exceptionless.io/mcp
+$ claude mcp login exceptionless
+Opening browser to authorize Exceptionless... done
+
+> What's my top error this week? Find the cause and fix it.
+
+● exceptionless.search_stacks
+● exceptionless.get_stack
+● exceptionless.get_stack_events
+
+NullReferenceException in OrderService.Submit is your top
+error: 1,284 occurrences, 212 users. order.Customer is null
+for guest checkouts. I'll add a guard and a regression test.
+
+
+
+
+
+ +
+
+
+

{{ icons["layout-dashboard"] }} One place for app health

+

More than error tracking

+

Send logs, 404s, feature usage, and sessions to the same place, then search, slice, and get notified across all of it.

+
+ +
+
+ {{ icons["list-filter"] }} +

Search that speaks developer

+

Filter by any field, tag, user, version, or custom data with a simple query syntax, then save it as a view for the whole team.

+
+
+
{{ icons.search }}type:error (status:open OR status:regressed) tag:checkout
+
+ Most Frequent Errors + Most Frequent 404s + Most Used Features + My saved view
- +
+
+
+
+ {{ icons.bell }} +

Alerts that matter, nothing more

+

Get notified about new errors, regressions, and critical events by email, Slack, webhooks, or Zapier, with daily summaries for everything else.

+
+
+
{{ icons["rotate-ccw"] }}
Regression in Rocket Ship 2.4.1TimeoutException was fixed in 2.4.0 and is happening again.
+
{{ icons.bug }}
New error in Checkout APINullReferenceException in OrderService.Submit
+
+
+
+ +
+ {{ icons["scroll-text"] }} +

Logs and feature usage

+

Structured log messages with levels and sources, plus feature usage to see what people actually use.

+
+
+ {{ icons.users }} +

Sessions and users

+

Follow a user's session, see who was affected by each error, and find every event for a customer.

+
+
+ {{ icons.radio }} +

Real-time event stream

+

Watch events arrive live as you deploy, then drill into anything that looks off.

+
+
+ {{ icons["sliders-horizontal"] }} +

Real-time client configuration

+

Change log levels, ignore noisy errors, and flip settings in deployed apps without redeploying.

+
+
+ {{ icons["eye-off"] }} +

Privacy controls

+

Exclude sensitive fields like passwords and card numbers before they ever leave your app.

+
+
+ {{ icons.keyboard }} +

Built for keyboards

+

A command palette, keyboard shortcuts, guided tours, and a dark mode that is easy on the eyes at 2 a.m.

+
+
+ + +
+
+
+
+
+

{{ icons.github }} Open source since 2014

+

Your cloud or ours

+

The hosted service and the code on GitHub are the same product, so you are never locked in. Most teams let us run it; some need it on their own servers.

+
+
+
+

{{ icons.cloud }} Exceptionless Cloud

+

The fastest way to get going. We run Elasticsearch, scale ingestion, back up your data, and ship upgrades, so you can focus on your app.

+
    +
  • {{ icons.check }}Real-time alerts plus Slack, webhook, and Zapier integrations
  • +
  • {{ icons.check }}Up to 180 days of retention and unlimited users on larger plans
  • +
  • {{ icons.check }}Exie AI assistant on Medium plans and up
  • +
+ +
+
+

{{ icons.server }} Self-hosted

+

Need full control or strict data residency? Run the same product on your own infrastructure with Docker or Kubernetes. You operate Elasticsearch, storage, backups, and upgrades.

+
+
docker run --rm -it -p 5200:8080 \
+  exceptionless/exceptionless:latest
+
+ +
+
+
+
+ +
+
+
+
+
"Exceptionless is awesome. I've stopped worrying about whether I'm losing customers to bugs I don't know about."
+
Eric B.
+
+
+
"Exceptionless allows us to prioritize fixes smarter by showing frequently occurring errors. In real time!"
+
Ryan H.
+
+
+
+
+ +
+
+
+

Frequently asked questions

+
+
+
+ What is Exceptionless? {{ icons["chevron-down"] }} +
Exceptionless is an open source error monitoring service. Its clients capture unhandled exceptions, logs, feature usage, 404s, and user sessions from your apps, group similar errors into stacks, and notify you when a new error appears or a fixed one comes back.
+
+
+ Which languages and frameworks does Exceptionless support? {{ icons["chevron-down"] }} +
Exceptionless has clients for .NET (ASP.NET Core, console and worker services, WPF, and Windows Forms, plus NLog, log4net, and Serilog integrations), JavaScript in the browser and Node.js (including React, Vue, Angular, and Express), and React Native with Expo. Anything that can make an HTTP request can send events through the REST API.
+
+
+ How does Exceptionless use AI? {{ icons["chevron-down"] }} +
Exie, the built-in assistant, answers questions about your errors and can update stacks when you ask. The MCP server, included on every plan, lets coding agents like Claude Code, Codex, GitHub Copilot, and OpenCode search your errors and read stack traces while they write the fix. Learn more about AI in Exceptionless.
+
+
+ Is Exceptionless open source? Can I self-host it? {{ icons["chevron-down"] }} +
Yes. Exceptionless is licensed under Apache 2.0 and the hosted service runs the same code that is on GitHub. You can run it yourself with Docker or Kubernetes, or let us host it for you.
+
+
+ How much does Exceptionless cost? {{ icons["chevron-down"] }} +
Hosted plans are priced by the number of events you send each month, not by seats, and you are never charged overage fees. You can start without a credit card. See pricing for each plan's limits.
+
+
+ How long does setup take? {{ icons["chevron-down"] }} +
Most apps take a few minutes: install the client package, add your project's API key, and unhandled errors start arriving. The getting started guide walks through each platform.
+
+
+
+
-
-
+
+
+
+

Make your app exceptionless

+

Get set up in minutes. No credit card to start, no sales call, and pricing that stays predictable as you grow.

+ +
+
+
diff --git a/docs/news/2015/2015-05-06-exceptionless-api-usage-and-overview.md b/docs/news/2015/2015-05-06-exceptionless-api-usage-and-overview.md index 910445cd3f..3b9d4fe0ad 100644 --- a/docs/news/2015/2015-05-06-exceptionless-api-usage-and-overview.md +++ b/docs/news/2015/2015-05-06-exceptionless-api-usage-and-overview.md @@ -2,7 +2,7 @@ title: "Exceptionless API Usage and Overview" --- -# THESE DOCS HAVE BEEN UPDATED. SEE THE [NEW DOCS HERE](/docs/api/). +**These docs have been updated. See the [new API docs](/docs/api/).** ![Exceptionless API](/assets/img/news/Screenshot-2015-05-06-16.26.42-300x220.png) diff --git a/docs/news/2020/2020-10-29-comparing-monitoring-services.md b/docs/news/2020/2020-10-29-comparing-monitoring-services.md index bf7b22c2ee..22ccedd782 100644 --- a/docs/news/2020/2020-10-29-comparing-monitoring-services.md +++ b/docs/news/2020/2020-10-29-comparing-monitoring-services.md @@ -11,7 +11,7 @@ Error monitoring is vital to the success of any application. Console logs only g Each service, generally speaking, handles errors and logging for your applications, but not all services are created equally. Let's take a closer look at each and see how they stack up. -# Log Rocket +## Log Rocket [Log Rocket](https://logrocket.com) was founded in 2015 and is an error monitoring service that focuses on replaying the events that led up to the error. While some services focus on digging into the error details themselves, Log Rocket uses HTML from the user's session to reconstruct a playback of what the user experienced. @@ -25,7 +25,7 @@ Log Rocket is a venture-backed company that has raised $30 million in its histor Their focus is on user experience through the tracking of everything a user does on the site. While this is helpful, it is also a bit invasive in the fact that the default installation of Log Rocket captures just about everything a user does in the application. -# Sentry +## Sentry [Sentry](https://sentry.io) was founded in 2012 and is focused on capturing errors at the code-level and sending them to a repository for review and organization. Sentry allows you to configure the groupings of errors and presents them in an interface designed to surface the most-pressing errors first. @@ -40,7 +40,7 @@ One big differentiator for Sentry is its focus on providing services for a wide > Sentry differentiates from legacy application performance monitoring solutions by focusing on software that runs on devices its developers have no control over, including mobile and IoT devices and smart sensor networks. - [Techcrunch, 2019](https://techcrunch.com/2019/09/24/sentry-raises-40-million-series-c-led-by-accel-for-its-error-tracking-software/) -# Exceptionless +## Exceptionless [Exceptionless](https://exceptionless.com) has been around the longest of the three services reviewed here. Created as a software offering from the parent company [CodeSmith Tools](https://www.codesmithtools.com/), Exceptionless was established in 2010 and is privately held. It is positioned as a tool to help first and a product second. This is why one of Exceptionless's main focuses is the open-source community. @@ -54,7 +54,7 @@ Digging into the product features, Exceptionless provides one of the cleanest vi All the information you need about errors and events are captured in a simple, easy to read view. From your dashboard, you can consolidate events into stacks to help group relevant issues. You can also indicate the resolution of events based not just on the fact that the issue was resolve but based on the version of your software that fixed the event. Exceptionless will automatically recognize any new errors that come in with an older version and group them in the resolved bucket. However, should the error surface on the version of your software in which you marked the issue fixed, Exceptionless will classify this event as a regression without you having to manually do so. -# So Which One is Right For You? +## So Which One is Right For You? The answer to this often comes down to what's most important for your application. Each service has its merits, but the value provided differs based on use-cases. Log Rocket offers full session replays, but may not be the right solution for digging deep into stack traces. Sentry offers full stack trace reviews and error categorization, but it may not be the right solution if you need the ability to update your error handling configuration in real-time. Exceptionless provides real-time error monitoring and configuration, and it is committed to the open-source community. diff --git a/docs/news/index.vto b/docs/news/index.vto index 5ea80777c9..3e34273b52 100644 --- a/docs/news/index.vto +++ b/docs/news/index.vto @@ -4,12 +4,14 @@ layout: layouts/base.vto description: Exceptionless news, release notes, and engineering updates. tags: [] --- - - -
-
- +
+
+

{{ icons.newspaper }} News

+

Releases, guides, and updates

+

What's new in Exceptionless, plus guides on error monitoring and debugging from the team. Subscribe via RSS.

+
+ +
+
diff --git a/docs/pricing.vto b/docs/pricing.vto index 350b5ebe28..2169fc6582 100644 --- a/docs/pricing.vto +++ b/docs/pricing.vto @@ -1,159 +1,273 @@ --- title: Pricing layout: layouts/base.vto -description: Exceptionless hosted and self-hosted pricing. +description: Simple Exceptionless pricing based on monthly events, not seats. The MCP server is on every plan; paid plans add real-time alerts, integrations, and Exie. --- - +
+
+

{{ icons.tag }} Pricing

+

Simple pricing that grows with you

+

Pay for the events you send, not the seats on your team. Every plan includes the full app and the MCP server for AI coding agents; paid plans add real-time alerts, integrations, longer retention, and Exie.

+
+ + +
+
+
-
-
-
-
-
-
-
-
-
-
Free
-
$0Per Month
-
-
-
    -
  • 1 project / 1 user
  • -
  • 3 days event retention
  • -
  • 3,000 events per month
  • -
  • No premium features
  • -
-
-
-
-
-
-
-
Small
-
$15Per Month
-
-
-
    -
  • 5 projects / 10 users
  • -
  • 30 days event retention
  • -
  • 15,000 events per month
  • -
  • Premium features included
  • -
-
-
-
-
-
-
-
Medium
-
$49Per Month
-
-
-
    -
  • 15 projects / 25 users
  • -
  • 90 days event retention
  • -
  • 75,000 events per month
  • -
  • Premium features included
  • -
-
-
-
-
-
+
+
+
+
+

Free

+

For a single developer evaluating Exceptionless.

+
$0/month
+

No credit card required

+ Get started +
    +
  • {{ icons.check }}3,000 events per month
  • +
  • {{ icons.check }}3 days of retention
  • +
  • {{ icons.check }}1 project, 1 user
  • +
  • {{ icons.plug }}MCP server for AI agents
  • +
  • {{ icons.minus }}Daily summary emails only
  • +
+
+ +
+

Small

+

For small teams shipping a few apps.

+
$15/month
+

Billed monthly

+ Get started +
    +
  • {{ icons.check }}15,000 events per month
  • +
  • {{ icons.check }}30 days of retention
  • +
  • {{ icons.check }}5 projects, 10 users
  • +
  • {{ icons.check }}Premium features
  • +
  • {{ icons.plug }}MCP server for AI agents
  • +
+
+ + + +
+

Large

+

For whole engineering teams.

+
$99/month
+

Billed monthly

+ Get started +
    +
  • {{ icons.check }}250,000 events per month
  • +
  • {{ icons.check }}180 days of retention
  • +
  • {{ icons.check }}Unlimited projects and users
  • +
  • {{ icons.check }}Premium features
  • +
  • {{ icons["ai-sparkle"] }}Exie AI assistant
  • +
  • {{ icons.plug }}MCP server for AI agents
  • +
+
-
-
-
-
-
-
-
Large
-
$99Per Month
-
-
-
    -
  • Unlimited projects / users
  • -
  • 180 days event retention
  • -
  • 250,000 events per month
  • -
  • Premium features included
  • -
-
-
-
-
-
-
-
Extra Large
-
$199Per Month
-
-
-
    -
  • Unlimited projects / users
  • -
  • 180 days event retention
  • -
  • 1,000,000 events per month
  • -
  • Premium features included
  • -
-
-
-
-
-
-
-
Enterprise
-
$499Per Month
-
-
-
    -
  • Unlimited projects / users
  • -
  • 180 days event retention
  • -
  • 3,000,000 events per month
  • -
  • Premium features included
  • -
-
-
-
-
+ +
+
+
+

Extra Large

+

1,000,000 events per month, 180 days of retention, unlimited projects and users.

-
- -
-
-

Frequently Asked Questions

-
-
Can I try before I buy?
-
Yes! Just use our free plan and start tracking exceptions, log messages or feature usages in minutes.
-
Can I change my plan at any time?
-
Yes. You can change your plan at any time.
-
Can I cancel my account at any time?
-
If you decide that you no longer want to use Exceptionless, simply cancel before your next billing period.
-
What happens if I go over my error limit?
-
We will simply send you a notification. If you continually exceed your limit, you will be asked to upgrade your plan or your account will be closed.
-
What are the premium features?
-
Premium features are only available in the paid plans. Here is a list of the premium features:
-
-
    -
  • Searching
  • -
  • Error occurrence notifications (only daily summaries are allowed in the free plan)
  • -
  • Web hooks, Slack integration, and Zapier integration
  • -
  • Additional premium features coming soon.
  • -
-
-
Can I host Exceptionless myself?
-
Sure! Feel free to visit Exceptionless on GitHub for hosting details if you have the resources to set it up.
-
+
+ $199 + per month +
+
+
+
+

Enterprise

+

3,000,000 events per month, 180 days of retention, unlimited projects and users.

-
-
-

Important Information

-
    -
  • No credit card required.
  • -
-
+
+ $499 + per month
+
+
+
+

Self-hosted

+

Run it on your own infrastructure with no limits. You operate it; Apache 2.0 licensed.

+
+
+ Open source + Read the guide +
+
+
+
+
+ +
+
+
+

Compare plans

+

Every plan includes intelligent stacking, detailed event reports, logs, feature usage, sessions, and the full app.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlanFreeSmallMediumLargeExtra LargeEnterprise
Monthly price$0$15$49$99$199$499
Yearly price—$165$539$1,089$2,189$5,489
Limits
Events per month3,00015,00075,000250,0001,000,0003,000,000
Data retention3 days30 days90 days180 days180 days180 days
Projects1515UnlimitedUnlimitedUnlimited
Users11025UnlimitedUnlimitedUnlimited
Features
Stacking, event details, logs, and sessions{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
Daily summary emails{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
Advanced search and custom filters—{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
Real-time new, regression, and critical notifications—{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
Slack, webhooks, and Zapier—{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
Geolocation—{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
MCP server for AI coding agents{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
Exie AI assistant——{{ icons.check }}{{ icons.check }}{{ icons.check }}{{ icons.check }}
+
+
+
+ +
+
+
+

Frequently asked questions

+
+
+
+ Can I try Exceptionless before I buy? {{ icons["chevron-down"] }} +
Yes. Sign up with no credit card and send your first events on the Free plan. When you're ready for real-time alerts, integrations, longer retention, more users, or Exie, upgrade in a couple of clicks.
+
+
+ Can I change or cancel my plan at any time? {{ icons["chevron-down"] }} +
Yes. Upgrade, downgrade, or switch between monthly and yearly billing from your organization's billing page. If you no longer want to use Exceptionless, cancel before your next billing period.
+
+
+ What counts as an event? {{ icons["chevron-down"] }} +
Every error, log message, feature usage, 404, or custom event your apps send counts as one event. Session heartbeats don't count toward your limit, and you can use client configuration and log levels to control how much you send.
+
+
+ What happens if I go over my event limit? {{ icons["chevron-down"] }} +
Exceptionless stops accepting new events until your next billing period and lets you know, so you can upgrade if you need more room. You're never charged surprise overage fees, and the data you've already collected isn't affected.
+
+
+ What are premium features? {{ icons["chevron-down"] }} +
+ Premium features are included on every paid plan: +
    +
  • Advanced search and filtering on any field
  • +
  • Real-time notifications for new, regressed, and critical errors (the free plan gets daily summaries)
  • +
  • Slack, webhook, and Zapier integrations
  • +
  • Geolocation of events
  • +
+
+
+
+ Which plans include Exie? {{ icons["chevron-down"] }} +
The Exie AI assistant is included with Medium, Large, Extra Large, and Enterprise plans. Each plan includes a monthly AI usage allowance, and there's nothing extra to set up.
+
+
+ Which plans include the MCP server? {{ icons["chevron-down"] }} +
All of them, including Free. The MCP server lets coding agents like Claude Code, Codex, GitHub Copilot, and OpenCode work with your errors, and it uses your plan like any other API access, with no extra charge. Set up the MCP server.
+
+
+ How much do I save with yearly billing? {{ icons["chevron-down"] }} +
Yearly plans are priced at 11 months, so you get one month free compared to paying monthly.
+
+
+ Can I host Exceptionless myself? {{ icons["chevron-down"] }} +
Absolutely. Exceptionless is open source under the Apache 2.0 license and you can run it on your own infrastructure with Docker or Kubernetes. You take on operating Elasticsearch, storage, backups, and upgrades, which the hosted service handles for you. See the self-hosting guide to get started, or browse the code on GitHub.
+
+
+ Need something else? {{ icons["chevron-down"] }} +
If you need more events, longer retention, or have questions about billing, send us a message or reach us through Help → Support in the app.
+
+
+
+
+ +
+
+
+

Get set up in minutes

+

No credit card required to sign up. Upgrade when you're ready for real-time alerts, integrations, and Exie.

+
-
-
+ diff --git a/docs/public/apple-touch-icon.png b/docs/public/apple-touch-icon.png new file mode 100644 index 0000000000..97e0dfacf5 Binary files /dev/null and b/docs/public/apple-touch-icon.png differ diff --git a/docs/public/assets/Working-Space.mp4 b/docs/public/assets/Working-Space.mp4 deleted file mode 100644 index 90e5334645..0000000000 Binary files a/docs/public/assets/Working-Space.mp4 and /dev/null differ diff --git a/docs/public/assets/css/custom.css b/docs/public/assets/css/custom.css deleted file mode 100644 index 3cf9242e3b..0000000000 --- a/docs/public/assets/css/custom.css +++ /dev/null @@ -1,827 +0,0 @@ -body { - background-image: url("/assets/img/body-bg2.png"); - background-position: left top; - background-size: auto; - background-repeat: repeat; - background-attachment: fixed; -} - -.home h1 { - font-size: 31.5px; -} - -a, a.active, a:hover, a.hover, a.visited, a:visited, a.link, a:link{ color: #0088cc;}#wrap{ color: #333333; } -body, input, button, select, textarea, .search-query {font-family: Open Sans;} -.btn-primary, a.btn-primary{color: #ffffff;background-color: #598e0e;background-image: -moz-linear-gradient(top, #73a818, #346900); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#73a818), to(#346900));background-image: -webkit-linear-gradient(top, #73a818, #346900);background-image: -o-linear-gradient(top, #73a818, #346900);background-image: linear-gradient(to bottom, #73a818, #346900);background-repeat: repeat-x;*background-color: #346900;}.btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] {color: #ffffff;background-color: #346900;*background-color: #285d00;}a.btn-success, a.btn-info, a.btn-warning, a.btn-error, a.btn-inverse{color: #fff;} -
-
-
RETAIN
INNOVATE
EVOLVE
-
- -
- -
+
+
+

{{ icons["heart-handshake"] }} Why Exceptionless

+

The bugs you don't know about cost you users

+

Most people who hit an error don't report it. They just leave. Exceptionless shows you what's broken, who it affects, and whether your fix worked, without an enterprise price tag or lock-in.

+
+
+ +
+
+
+
+ {{ icons.users }} +

Keep the users you worked to win

+

Catch the errors people hit every day but never report, and fix them before frustration turns into churn.

+
+
+ {{ icons.rocket }} +

Spend your time building

+

Stop reproducing bugs from vague reports. Get the stack trace, request, user, and context the first time, then get back to features.

+
+
+ {{ icons["badge-check"] }} +

Be the app that just works

+

Know about regressions before your customers do, and prove that your fixes actually stuck.

+
-
- -
-
+ {{ include "partials/signup-banner.vto" { cta: "why-top", title: "Find out what your users are running into", secondaryHref: "/tour/", secondaryLabel: "Take the tour" } }} +
+
-
- -
Exceptionless Customers & Users
-
Exceptionless Users & Customers
-
-

Why Exceptionless?

-

You’re Losing Users, Leads, and Customers

-

Chances are, you’re losing users every day because of minor or major bugs or errors that aren’t being reported in your app or website. Exceptionless catches these bugs and notifies you, allowing you to fix them quickly and retain those users.

-

Innovate, Don’t Get Stuck Fixing Bugs!

-

Developers should be building the next big thing or adding that revenue-doubling feature, not wasting their time tracking down bugs that could have been caught right away and fixed during the development process. Progress, not regress.

-

Be That Company

-

You know that company. The one everyone loves because their systems, website, applications, tools, etc just work! You want to be those guys, and Exceptionless can help you get there by helping make sure the code powering your services is error free!

-
-
"Exceptionless is awesome. I’ve STOPPED worrying about whether I’m losing customers to bugs I don’t know about." – Eric B
-
-
3,711,629,930 EVENTS, AND COUNTING… // 9700+ ACTIVE PROJECTS
-
"Exceptionless allows us to prioritize fixes smarter by showing frequently occurring errors. In real time!"
- – Ryan H.
-
-

Make Developer Life Easier

-

Simply put, Exceptionless makes developer life easier by reporting, logging, tracking, and providing the important details about bugs in real time so action can be taken and the developer can move on to important things, like working on actual features.

-

Unique Features

-
    -
  • Detailed Dashboard
  • -
  • Unlimited Users per Organization
  • -
  • Easy & Fast Setup
  • -
  • Event Notifications
  • -
  • Mark Events as Fixed or Critical
  • -
  • Monitor Fixed Events for Regression
  • -
  • Detailed Error Reports
  • -
  • Real-time View as Events Occur
  • -
  • Open Source – Self Host for Free! (affordable hosting available)
  • -
-
-
- +
+
+
+

{{ icons.star }} What makes us different

+

Built by developers, for developers

+

Exceptionless has been catching production errors since 2013. Here's what teams tell us made them switch, and stay.

+
+
+
+ {{ icons.github }} +
+

Open source, for real

+

The hosted service runs the same code you can read, audit, and contribute to on GitHub under the Apache 2.0 license. No closed-core features, no surprises.

+
+
+
+ {{ icons.server }} +
+

Let us run it, or run it yourself

+

Use the hosted service and never think about infrastructure, or keep data on your own servers with Docker or Kubernetes. The code is the same either way, so switching later is always an option.

+
+
+
+ {{ icons.scale }} +
+

Simple, predictable pricing

+

Plans are based on monthly events, not seats. Larger plans include unlimited users and projects, with no surprise overage charges.

+
+
+
+ {{ icons["sliders-horizontal"] }} +
+

Change behavior without redeploying

+

Real-time client configuration lets you adjust log levels, ignore noisy errors, and toggle settings in apps that are already running.

+
+
+
+ {{ icons.code }} +
+

Deep .NET roots, first-class JavaScript and mobile

+

Born in the .NET world with clients for ASP.NET Core, WPF, console apps, and every major logging library, plus browser and Node.js clients with source map support, and a React Native client that works with Expo.

+
+
+ {{ icons["ai-sparkle"] }} +
+

AI that works with your data

+

Ask Exie about your errors in plain English, or connect your coding agent through the MCP server. Both use your permissions and only change things when you ask. See how it works.

+
+
+
+ {{ icons["shield-check"] }} +
+

Privacy you control

+

Exclude sensitive fields before events leave your app, decide whether to collect private information, and host it all yourself if you need to.

+
+
+
+ {{ icons["heart-handshake"] }} +
+

Real people behind it

+

A small, independent team that has been building, running, and supporting Exceptionless for more than a decade.

+
+
+
+ +
+
-
-
+
+
+
+
+
"Exceptionless is awesome. I've stopped worrying about whether I'm losing customers to bugs I don't know about."
+
Eric B.
+
+
+
"Exceptionless allows us to prioritize fixes smarter by showing frequently occurring errors. In real time!"
+
Ryan H.
+
+
+
+
+ +
+
+
+

Stop guessing what's broken

+

Set up Exceptionless in minutes and see the errors your users have been quietly running into.

+ +
+
+