Skip to content

Commit

Permalink
feat(docs): add analytics instrumentation doc (#1966)
Browse files Browse the repository at this point in the history
* feat(docs): add analytics instrumentation doc

* feat(Docs): add event listener code examples

* fix(Docs): code-snippet scroll issue

* fix(Docs): use carbon unorderedList component
  • Loading branch information
theiliad authored Mar 5, 2025
1 parent 6c6226d commit f0da6ae
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 6 deletions.
9 changes: 6 additions & 3 deletions packages/docs/src/components/DocsSideNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ const DocsSideNav: React.FC<Props> = ({ isSideNavExpanded }) => (
</SideNavMenu>
<SideNavDivider />
<SideNavMenu title="Data & configuration" defaultExpanded={true}>
<SideNavMenuItem as={NavLink} to="/apidocs">
API
</SideNavMenuItem>
<SideNavMenuItem as={NavLink} to="/analytics-instrumentation">
Analytics Instrumentation
</SideNavMenuItem>
<SideNavMenuItem as={NavLink} to="/data">
Chart data
</SideNavMenuItem>
Expand Down Expand Up @@ -55,9 +61,6 @@ const DocsSideNav: React.FC<Props> = ({ isSideNavExpanded }) => (
<SideNavMenuItem as={NavLink} to="/zoombar">
Zoombar
</SideNavMenuItem>
<SideNavMenuItem as={NavLink} to="/apidocs">
API
</SideNavMenuItem>
</SideNavMenu>
<SideNavDivider />
<SideNavMenu title="Design" defaultExpanded={true}>
Expand Down
4 changes: 3 additions & 1 deletion packages/docs/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
Data,
Options,
Api,
AnalyticsInstrumentation,
Themes,
Axes,
Palettes,
Expand All @@ -25,6 +26,7 @@ import {
CirclePack,
Combo,
Donut,
EventListeners,
Gauge,
Heatmap,
Histogram,
Expand All @@ -48,7 +50,6 @@ import {
} from './routes'

import './index.scss'
import EventListeners from './routes/EventListeners'

const App: React.FC = () => (
<BrowserRouter>
Expand All @@ -68,6 +69,7 @@ const App: React.FC = () => (
<Route path="truncation" element={<Truncation />} />
<Route path="zoombar" element={<Zoombar />} />
<Route path="apidocs" element={<Api />} />
<Route path="analytics-instrumentation" element={<AnalyticsInstrumentation />} />
<Route path="event-listeners" element={<EventListeners />} />
<Route path="themes" element={<Themes />} />
<Route path="axes" element={<Axes />} />
Expand Down
163 changes: 163 additions & 0 deletions packages/docs/src/routes/AnalyticsInstrumentation.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
import { useEffect } from 'react'
import hljs from 'highlight.js/lib/core'
import javascript from 'highlight.js/lib/languages/javascript'
import { CodeSnippet } from '@carbon/react/es'
import PageHeader from '../components/PageHeader'

export default function AnalyticsInstrumentation() {
const highlightCode = () => {
hljs.registerLanguage('javascript', javascript)

const nodes = document.querySelectorAll('pre code')
nodes.forEach(el => {
hljs.highlightElement(el as HTMLElement)
})
}

useEffect(() => {
highlightCode()
})

return (
<>
<PageHeader title="Instrumenting Telemetry & Analytics" />

<p>
Carbon Charts provides an events service that can be leveraged to track user interactions
and send telemetry data to analytics platforms like Amplitude. Below are examples of how to
instrument your charts to gather user behavior data.
</p>

<h2>Basic Telemetry Setup</h2>

<p>
To track interactions with your chart, use a reference to the chart to add event listeners
for the dispatched events. The following example shows how to track legend clicks:
</p>

<CodeSnippet className="language-javascript" type="multi">{`// Initialize Amplitude
amplitude.init("YOUR_AMPLITUDE_API_KEY")
// Track legend interactions
chart.services.events.addEventListener("legend-item-onclick", ({ detail }) => {
amplitude.track("Chart_LegendClick", {
chartId: "sales-dashboard-main",
toggledSeries: detail.selection
})
})`}</CodeSnippet>

<h2>Common Events To Track</h2>

<p>Here are examples of events that could provide valuable user interaction data:</p>

<CodeSnippet className="language-javascript" type="multi">{`// Track bar clicks
chart.services.events.addEventListener("bar-click", ({ detail }) => {
amplitude.track("Chart_BarClick", {
group: detail.datum.group,
value: detail.datum.value
})
})
// Track when charts finish rendering
chart.services.events.addEventListener("render-finished", ({ detail }) => {
amplitude.track("Chart_Rendered", {
renderTime: // number of seconds it took to render the chart
})
})
// Track tooltip interactions
chart.services.events.addEventListener("show-tooltip", ({ detail }) => {
amplitude.track("Chart_TooltipView", {
data: detail.data
})
})`}</CodeSnippet>

<h2>Debouncing High-Frequency Events</h2>

<p>
For events that may fire frequently, such as tooltips or mouse movements, debouncing could
be used to prevent overwhelming your analytics platform:
</p>

<CodeSnippet className="language-javascript" type="multi">{`import { debounce } from "lodash"
// Create debounced tracking function
const debouncedTrack = debounce((eventName, eventData) => {
amplitude.track(eventName, eventData)
}, 300)
// Apply to tooltip events
chart.services.events.addEventListener("show-tooltip", ({ detail }) => {
debouncedTrack("Chart_TooltipView", {
data: detail.data
})
})`}</CodeSnippet>

<h2>React Integration Pattern</h2>

<p>
When using Carbon Charts with React, you can set up event listeners using refs and
useEffect:
</p>

<CodeSnippet
className="language-javascript"
type="multi">{`import { BarChart } from "@carbon/charts-react"
import { useRef, useEffect } from "react"
import amplitude from "amplitude-js"
function InstrumentedChart({ data, options }) {
const chartRef = useRef(null)
// Set up event tracking
useEffect(() => {
if (chartRef.current) {
const events = chartRef.current.chart.services.events
// Track bar clicks
events.addEventListener("bar-click", ({ detail }) => {
amplitude.track("Chart_BarClick", {
group: detail.datum.group,
value: detail.datum.value
})
})
// Track render completion
events.addEventListener("render-finished", ({ detail }) => {
amplitude.track("Chart_Rendered", {
renderTime: // number of seconds it took to render the chart
})
})
}
// Clean up event listeners
return () => {
if (chartRef.current) {
const events = chartRef.current.chart.services.events
events.removeEventListener("bar-click", handleBarClick)
events.removeEventListener("render-finished", handleRenderFinished)
}
}
}, [chartRef])
return (
<BarChart
ref={chartRef}
data={data}
options={options}
/>
)
}`}</CodeSnippet>

<p>
Event-based telemetry allows applications to gather valuable user behavior data without
disrupting the user experience. More information on available event listeners can be found{' '}
<a href="/api/modules/interfaces.events" target="_blank">
here
</a>
.
</p>
</>
)
}
22 changes: 21 additions & 1 deletion packages/docs/src/routes/Api.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useEffect } from 'react'
import hljs from 'highlight.js/lib/core'
import javascript from 'highlight.js/lib/languages/javascript'
import { CodeSnippet } from '@carbon/react/es'
import { CodeSnippet, ListItem, UnorderedList } from '@carbon/react/es'
import PageHeader from '../components/PageHeader'
import styled from 'styled-components'

Expand Down Expand Up @@ -74,6 +74,26 @@ console.log(myChart)
.
</p>

<h3>Event Listener Code Examples</h3>
<UnorderedList>
<ListItem>
<a
href="https://stackblitz.com/edit/751z9aet?file=index.js%3AL17"
target="_blank"
rel="nofollow">
vanilla
</a>
</ListItem>
<ListItem>
<a
href="https://stackblitz.com/edit/react-uwtozmsz?file=src%2Findex.js%3AL17"
target="_blank"
rel="nofollow">
React
</a>
</ListItem>
</UnorderedList>

<h2>Full Documentation</h2>

<ApiContainer title="API Documentation" src="/api" />
Expand Down
22 changes: 21 additions & 1 deletion packages/docs/src/routes/EventListeners.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useEffect } from 'react'
import hljs from 'highlight.js/lib/core'
import javascript from 'highlight.js/lib/languages/javascript'
import { CodeSnippet } from '@carbon/react/es'
import { CodeSnippet, ListItem, UnorderedList } from '@carbon/react/es'
import PageHeader from '../components/PageHeader'

export default function EventListeners() {
Expand Down Expand Up @@ -44,6 +44,26 @@ export default function EventListeners() {
</a>
.
</p>

<h3>Code Examples</h3>
<UnorderedList>
<ListItem>
<a
href="https://stackblitz.com/edit/751z9aet?file=index.js%3AL17"
target="_blank"
rel="nofollow">
vanilla
</a>
</ListItem>
<ListItem>
<a
href="https://stackblitz.com/edit/react-uwtozmsz?file=src%2Findex.js%3AL17"
target="_blank"
rel="nofollow">
React
</a>
</ListItem>
</UnorderedList>
</>
)
}
4 changes: 4 additions & 0 deletions packages/docs/src/routes/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Anatomy from './Anatomy.tsx'
import Data from './Data.tsx'
import Options from './Options.tsx'
import Api from './Api.tsx'
import AnalyticsInstrumentation from './AnalyticsInstrumentation'
import Themes from './Themes.tsx'
import Axes from './Axes.tsx'
import Palettes from './Palettes.tsx'
Expand All @@ -20,6 +21,7 @@ import Choropleth from './Choropleth.tsx'
import CirclePack from './CirclePack.tsx'
import Combo from './Combo.tsx'
import Donut from './Donut.tsx'
import EventListeners from './EventListeners'
import Gauge from './Gauge.tsx'
import Heatmap from './Heatmap.tsx'
import Histogram from './Histogram.tsx'
Expand Down Expand Up @@ -50,6 +52,7 @@ export {
Data,
Options,
Api,
AnalyticsInstrumentation,
Themes,
Axes,
Palettes,
Expand All @@ -64,6 +67,7 @@ export {
CirclePack,
Combo,
Donut,
EventListeners,
Gauge,
Heatmap,
Histogram,
Expand Down

0 comments on commit f0da6ae

Please sign in to comment.