Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@ coverage
.turbo

.databricks

.superset/config.json
2 changes: 2 additions & 0 deletions apps/dev-playground/app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ env:
valueFrom: genie-space
- name: DATABRICKS_SERVING_ENDPOINT_NAME
valueFrom: serving-endpoint
- name: DATABRICKS_JOB_ID
valueFrom: job
# Files plugin manifest declares a static DATABRICKS_VOLUME_FILES
# requirement; keep it bound so appkit's runtime validation passes
# even though the policy harness below uses its own keys.
Expand Down
92 changes: 92 additions & 0 deletions apps/dev-playground/appkit.plugins.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
{
"$schema": "https://databricks.github.io/appkit/schemas/template-plugins.schema.json",
"version": "1.0",
"plugins": {
"analytics": {
"name": "analytics",
"displayName": "Analytics Plugin",
"description": "SQL query execution against Databricks SQL Warehouses",
"package": "@databricks/appkit",
"resources": {
"required": [
{
"type": "sql_warehouse",
"alias": "SQL Warehouse",
"resourceKey": "sql-warehouse",
"description": "SQL Warehouse for executing analytics queries",
"permission": "CAN_USE",
"fields": {
"id": {
"env": "DATABRICKS_WAREHOUSE_ID",
"description": "SQL Warehouse ID"
}
}
}
],
"optional": []
},
"requiredByTemplate": true
},
"files": {
"name": "files",
"displayName": "Files Plugin",
"description": "File operations against Databricks Volumes and Unity Catalog",
"package": "@databricks/appkit",
"resources": {
"required": [
{
"type": "volume",
"alias": "Files",
"resourceKey": "files",
"description": "Permission to write to volumes",
"permission": "WRITE_VOLUME",
"fields": {
"path": {
"env": "DATABRICKS_VOLUME_FILES",
"description": "Volume path for file storage (e.g. /Volumes/catalog/schema/volume_name)"
}
}
}
],
"optional": []
},
"requiredByTemplate": true
},
"genie": {
"name": "genie",
"displayName": "Genie Plugin",
"description": "AI/BI Genie space integration for natural language data queries",
"package": "@databricks/appkit",
"resources": {
"required": [
{
"type": "genie_space",
"alias": "Genie Space",
"resourceKey": "genie-space",
"description": "Genie Space for AI-powered data queries. Space IDs configured via plugin config.",
"permission": "CAN_RUN",
"fields": {
"id": {
"env": "DATABRICKS_GENIE_SPACE_ID",
"description": "Default Genie Space ID"
}
}
}
],
"optional": []
},
"requiredByTemplate": true
},
"server": {
"name": "server",
"displayName": "Server Plugin",
"description": "HTTP server with Express, static file serving, and Vite dev mode support",
"package": "@databricks/appkit",
"resources": {
"required": [],
"optional": []
},
"requiredByTemplate": true
}
}
}
21 changes: 21 additions & 0 deletions apps/dev-playground/client/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { Route as ReconnectRouteRouteImport } from './routes/reconnect.route'
import { Route as PolicyMatrixRouteRouteImport } from './routes/policy-matrix.route'
import { Route as LakebaseRouteRouteImport } from './routes/lakebase.route'
import { Route as JobsRouteRouteImport } from './routes/jobs.route'
import { Route as InternalTelemetryRouteRouteImport } from './routes/internal-telemetry.route'
import { Route as GenieRouteRouteImport } from './routes/genie.route'
import { Route as FilesRouteRouteImport } from './routes/files.route'
import { Route as DataVisualizationRouteRouteImport } from './routes/data-visualization.route'
Expand Down Expand Up @@ -71,6 +72,11 @@ const JobsRouteRoute = JobsRouteRouteImport.update({
path: '/jobs',
getParentRoute: () => rootRouteImport,
} as any)
const InternalTelemetryRouteRoute = InternalTelemetryRouteRouteImport.update({
id: '/internal-telemetry',
path: '/internal-telemetry',
getParentRoute: () => rootRouteImport,
} as any)
const GenieRouteRoute = GenieRouteRouteImport.update({
id: '/genie',
path: '/genie',
Expand Down Expand Up @@ -115,6 +121,7 @@ export interface FileRoutesByFullPath {
'/data-visualization': typeof DataVisualizationRouteRoute
'/files': typeof FilesRouteRoute
'/genie': typeof GenieRouteRoute
'/internal-telemetry': typeof InternalTelemetryRouteRoute
'/jobs': typeof JobsRouteRoute
'/lakebase': typeof LakebaseRouteRoute
'/policy-matrix': typeof PolicyMatrixRouteRoute
Expand All @@ -133,6 +140,7 @@ export interface FileRoutesByTo {
'/data-visualization': typeof DataVisualizationRouteRoute
'/files': typeof FilesRouteRoute
'/genie': typeof GenieRouteRoute
'/internal-telemetry': typeof InternalTelemetryRouteRoute
'/jobs': typeof JobsRouteRoute
'/lakebase': typeof LakebaseRouteRoute
'/policy-matrix': typeof PolicyMatrixRouteRoute
Expand All @@ -152,6 +160,7 @@ export interface FileRoutesById {
'/data-visualization': typeof DataVisualizationRouteRoute
'/files': typeof FilesRouteRoute
'/genie': typeof GenieRouteRoute
'/internal-telemetry': typeof InternalTelemetryRouteRoute
'/jobs': typeof JobsRouteRoute
'/lakebase': typeof LakebaseRouteRoute
'/policy-matrix': typeof PolicyMatrixRouteRoute
Expand All @@ -172,6 +181,7 @@ export interface FileRouteTypes {
| '/data-visualization'
| '/files'
| '/genie'
| '/internal-telemetry'
| '/jobs'
| '/lakebase'
| '/policy-matrix'
Expand All @@ -190,6 +200,7 @@ export interface FileRouteTypes {
| '/data-visualization'
| '/files'
| '/genie'
| '/internal-telemetry'
| '/jobs'
| '/lakebase'
| '/policy-matrix'
Expand All @@ -208,6 +219,7 @@ export interface FileRouteTypes {
| '/data-visualization'
| '/files'
| '/genie'
| '/internal-telemetry'
| '/jobs'
| '/lakebase'
| '/policy-matrix'
Expand All @@ -227,6 +239,7 @@ export interface RootRouteChildren {
DataVisualizationRouteRoute: typeof DataVisualizationRouteRoute
FilesRouteRoute: typeof FilesRouteRoute
GenieRouteRoute: typeof GenieRouteRoute
InternalTelemetryRouteRoute: typeof InternalTelemetryRouteRoute
JobsRouteRoute: typeof JobsRouteRoute
LakebaseRouteRoute: typeof LakebaseRouteRoute
PolicyMatrixRouteRoute: typeof PolicyMatrixRouteRoute
Expand Down Expand Up @@ -303,6 +316,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof JobsRouteRouteImport
parentRoute: typeof rootRouteImport
}
'/internal-telemetry': {
id: '/internal-telemetry'
path: '/internal-telemetry'
fullPath: '/internal-telemetry'
preLoaderRoute: typeof InternalTelemetryRouteRouteImport
parentRoute: typeof rootRouteImport
}
'/genie': {
id: '/genie'
path: '/genie'
Expand Down Expand Up @@ -363,6 +383,7 @@ const rootRouteChildren: RootRouteChildren = {
DataVisualizationRouteRoute: DataVisualizationRouteRoute,
FilesRouteRoute: FilesRouteRoute,
GenieRouteRoute: GenieRouteRoute,
InternalTelemetryRouteRoute: InternalTelemetryRouteRoute,
JobsRouteRoute: JobsRouteRoute,
LakebaseRouteRoute: LakebaseRouteRoute,
PolicyMatrixRouteRoute: PolicyMatrixRouteRoute,
Expand Down
8 changes: 8 additions & 0 deletions apps/dev-playground/client/src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@ function RootComponent() {
Telemetry
</Button>
</Link>
<Link to="/internal-telemetry" className="no-underline">
<Button
variant="ghost"
className="text-foreground hover:text-secondary-foreground"
>
Internal Telemetry
</Button>
</Link>
<Link to="/sql-helpers" className="no-underline">
<Button
variant="ghost"
Expand Down
19 changes: 19 additions & 0 deletions apps/dev-playground/client/src/routes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,25 @@ function IndexRoute() {
</div>
</Card>

<Card className="p-6 hover:shadow-lg transition-shadow cursor-pointer">
<div className="flex flex-col h-full">
<h3 className="text-2xl font-semibold text-foreground mb-3">
Internal Telemetry
</h3>
<p className="text-muted-foreground mb-6 flex-grow">
Manually trigger AppKit's internal telemetry events
(APP_STARTUP, HEARTBEAT, REQUEST_METRICS) and inspect what gets
POSTed to the workspace's <code>/telemetry</code> endpoint.
</p>
<Button
onClick={() => navigate({ to: "/internal-telemetry" })}
className="w-full"
>
Open Internal Telemetry
</Button>
</div>
</Card>

<Card className="p-6 hover:shadow-lg transition-shadow cursor-pointer">
<div className="flex flex-col h-full">
<h3 className="text-2xl font-semibold text-foreground mb-3">
Expand Down
Loading
Loading