Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/unkeyed/unkey into analytic…
Browse files Browse the repository at this point in the history
…s-api
  • Loading branch information
chronark committed Jan 10, 2025
2 parents 7080b44 + a4d0af6 commit 85cce46
Show file tree
Hide file tree
Showing 13 changed files with 172 additions and 28 deletions.
6 changes: 6 additions & 0 deletions apps/dashboard/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @unkey/web

## 0.1.40

### Patch Changes

- @unkey/ratelimit@0.5.1

## 0.1.39

### Patch Changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ export default async function APIKeyDetailPage(props: {
.then((res) => res.val?.at(0)?.time ?? 0),
]);

// Sort all verifications by time first
const sortedVerifications = verifications.val!.sort((a, b) => a.time - b.time);

const successOverTime: { x: string; y: number }[] = [];
const ratelimitedOverTime: { x: string; y: number }[] = [];
const usageExceededOverTime: { x: string; y: number }[] = [];
Expand All @@ -119,30 +122,47 @@ export default async function APIKeyDetailPage(props: {
const expiredOverTime: { x: string; y: number }[] = [];
const forbiddenOverTime: { x: string; y: number }[] = [];

for (const d of verifications.val!.sort((a, b) => a.time - b.time)) {
// Get all unique timestamps
const uniqueDates = [...new Set(sortedVerifications.map((d) => d.time))].sort((a, b) => a - b);

// Ensure each array has entries for all timestamps with zero counts
for (const timestamp of uniqueDates) {
const x = new Date(timestamp).toISOString();
successOverTime.push({ x, y: 0 });
ratelimitedOverTime.push({ x, y: 0 });
usageExceededOverTime.push({ x, y: 0 });
disabledOverTime.push({ x, y: 0 });
insufficientPermissionsOverTime.push({ x, y: 0 });
expiredOverTime.push({ x, y: 0 });
forbiddenOverTime.push({ x, y: 0 });
}

for (const d of sortedVerifications) {
const x = new Date(d.time).toISOString();
const index = uniqueDates.indexOf(d.time);

switch (d.outcome) {
case "":
case "VALID":
successOverTime.push({ x, y: d.count });
successOverTime[index] = { x, y: d.count };
break;
case "RATE_LIMITED":
ratelimitedOverTime.push({ x, y: d.count });
ratelimitedOverTime[index] = { x, y: d.count };
break;
case "USAGE_EXCEEDED":
usageExceededOverTime.push({ x, y: d.count });
usageExceededOverTime[index] = { x, y: d.count };
break;
case "DISABLED":
disabledOverTime.push({ x, y: d.count });
disabledOverTime[index] = { x, y: d.count };
break;
case "INSUFFICIENT_PERMISSIONS":
insufficientPermissionsOverTime.push({ x, y: d.count });
insufficientPermissionsOverTime[index] = { x, y: d.count };
break;
case "EXPIRED":
expiredOverTime.push({ x, y: d.count });
expiredOverTime[index] = { x, y: d.count };
break;
case "FORBIDDEN":
forbiddenOverTime.push({ x, y: d.count });
forbiddenOverTime[index] = { x, y: d.count };
break;
}
}
Expand Down Expand Up @@ -209,6 +229,7 @@ export default async function APIKeyDetailPage(props: {
stats.forbidden += v.count;
}
});

const roleTee = key.workspace.roles.map((role) => {
const nested: NestedPermissions = {};
for (const permission of key.workspace.permissions) {
Expand Down Expand Up @@ -328,7 +349,7 @@ export default async function APIKeyDetailPage(props: {
<Metric label="Valid" value={formatNumber(stats.valid)} />
<Metric label="Ratelimited" value={formatNumber(stats.ratelimited)} />
<Metric label="Usage Exceeded" value={formatNumber(stats.usageExceeded)} />
<Metric label="Disabled" value={formatNumber(stats.valid)} />
<Metric label="Disabled" value={formatNumber(stats.disabled)} />
<Metric
label="Insufficient Permissions"
value={formatNumber(stats.insufficientPermissions)}
Expand Down
65 changes: 60 additions & 5 deletions apps/dashboard/components/dashboard/charts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ type ColorName = "primary" | "warn" | "danger";
export const useColors = (colorNames: Array<ColorName>) => {
const { resolvedTheme } = useTheme();

const colors: { light: Record<ColorName, string>; dark: Record<ColorName, string> } = {
const colors: {
light: Record<ColorName, string>;
dark: Record<ColorName, string>;
} = {
light: {
primary: "#1c1917",
warn: "#FFCD07",
Expand Down Expand Up @@ -133,9 +136,9 @@ export const LineChart: React.FC<{
tooltip={{
formatter: (datum) => ({
name: datum.category,
value: `${Intl.NumberFormat(undefined, { notation: "compact" }).format(
Number(datum.y),
)} ms`,
value: `${Intl.NumberFormat(undefined, {
notation: "compact",
}).format(Number(datum.y))} ms`,
}),
}}
/>
Expand Down Expand Up @@ -202,6 +205,53 @@ export const StackedColumnChart: React.FC<{
colors: Array<ColorName>;
}> = ({ data, timeGranularity, colors }) => {
const { axisColor } = useColors(colors);

const formatDate = (date: string) => {
const d = new Date(date);
if (Number.isNaN(d.getTime())) {
return date;
}

switch (timeGranularity) {
case "minute":
return d.toLocaleString(undefined, {
hour: "numeric",
minute: "2-digit",
hour12: true,
month: "short",
day: "numeric",
});
case "hour":
return d.toLocaleString(undefined, {
hour: "numeric",
hour12: true,
month: "short",
day: "numeric",
year: "numeric",
});
case "day":
return d.toLocaleString(undefined, {
weekday: "short",
month: "short",
day: "numeric",
year: "numeric",
});
case "month":
return d.toLocaleString(undefined, {
month: "long",
year: "numeric",
});
default:
return d.toLocaleString(undefined, {
month: "short",
day: "numeric",
year: "numeric",
hour: "numeric",
minute: "2-digit",
});
}
};

return (
<Column
isStack={true}
Expand Down Expand Up @@ -276,9 +326,14 @@ export const StackedColumnChart: React.FC<{
},
}}
tooltip={{
title: formatDate,
formatter: (datum) => ({
name: datum.category,
value: Intl.NumberFormat(undefined, { notation: "compact" }).format(Number(datum.y)),
value: Intl.NumberFormat(undefined, {
notation: "compact",
maximumFractionDigits: 1,
compactDisplay: "short",
}).format(Number(datum.y)),
}),
}}
/>
Expand Down
2 changes: 1 addition & 1 deletion apps/dashboard/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@unkey/dashboard",
"version": "0.1.39",
"version": "0.1.40",
"private": true,
"scripts": {
"dev": "next dev",
Expand Down
6 changes: 6 additions & 0 deletions packages/api/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @unkey/api

## 0.30.0

### Minor Changes

- 0746b33: Add the types for error codes

## 0.29.0

### Minor Changes
Expand Down
13 changes: 10 additions & 3 deletions packages/api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@unkey/api",
"version": "0.29.0",
"version": "0.30.0",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
Expand All @@ -9,12 +9,19 @@
"publishConfig": {
"access": "public"
},
"keywords": ["unkey", "client", "api"],
"keywords": [
"unkey",
"client",
"api"
],
"bugs": {
"url": "https://github.com/unkeyed/unkey/issues"
},
"homepage": "https://github.com/unkeyed/unkey#readme",
"files": ["./dist/**", "README.md"],
"files": [
"./dist/**",
"README.md"
],
"author": "Andreas Thomas <[email protected]>",
"scripts": {
"generate": "openapi-typescript https://api.unkey.dev/openapi.json -o ./src/openapi.d.ts",
Expand Down
8 changes: 7 additions & 1 deletion packages/api/src/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,10 @@ import type { paths } from "./openapi";

// this is what a json body response looks like
export type ErrorResponse =
paths["/v1/liveness"]["get"]["responses"]["500"]["content"]["application/json"];
| paths["/v1/liveness"]["get"]["responses"]["400"]["content"]["application/json"]
| paths["/v1/liveness"]["get"]["responses"]["401"]["content"]["application/json"]
| paths["/v1/liveness"]["get"]["responses"]["403"]["content"]["application/json"]
| paths["/v1/liveness"]["get"]["responses"]["404"]["content"]["application/json"]
| paths["/v1/liveness"]["get"]["responses"]["409"]["content"]["application/json"]
| paths["/v1/liveness"]["get"]["responses"]["429"]["content"]["application/json"]
| paths["/v1/liveness"]["get"]["responses"]["500"]["content"]["application/json"];
7 changes: 7 additions & 0 deletions packages/hono/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# @unkey/hono

## 1.4.11

### Patch Changes

- Updated dependencies [0746b33]
- @unkey/api@0.30.0

## 1.4.10

### Patch Changes
Expand Down
13 changes: 10 additions & 3 deletions packages/hono/package.json
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
{
"name": "@unkey/hono",
"version": "1.4.10",
"version": "1.4.11",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"license": "MIT",
"private": false,
"publishConfig": {
"access": "public"
},
"keywords": ["unkey", "client", "api", "hono"],
"keywords": [
"unkey",
"client",
"api",
"hono"
],
"bugs": {
"url": "https://github.com/unkeyed/unkey/issues"
},
"homepage": "https://github.com/unkeyed/unkey#readme",
"files": ["./dist/**"],
"files": [
"./dist/**"
],
"author": "Andreas Thomas <[email protected]>",
"scripts": {
"build": "tsup",
Expand Down
7 changes: 7 additions & 0 deletions packages/nextjs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# @unkey/nextjs

## 0.18.4

### Patch Changes

- Updated dependencies [0746b33]
- @unkey/api@0.30.0

## 0.18.3

### Patch Changes
Expand Down
13 changes: 10 additions & 3 deletions packages/nextjs/package.json
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
{
"name": "@unkey/nextjs",
"version": "0.18.3",
"version": "0.18.4",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"license": "MIT",
"private": false,
"publishConfig": {
"access": "public"
},
"keywords": ["unkey", "client", "api"],
"keywords": [
"unkey",
"client",
"api"
],
"bugs": {
"url": "https://github.com/unkeyed/unkey/issues"
},
"homepage": "https://github.com/unkeyed/unkey#readme",
"files": ["./dist/**", "README.md"],
"files": [
"./dist/**",
"README.md"
],
"author": "Andreas Thomas <[email protected]>",
"scripts": {
"build": "tsup"
Expand Down
7 changes: 7 additions & 0 deletions packages/ratelimit/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# @unkey/ratelimit

## 0.5.1

### Patch Changes

- Updated dependencies [0746b33]
- @unkey/api@0.30.0

## 0.5.0

### Minor Changes
Expand Down
14 changes: 11 additions & 3 deletions packages/ratelimit/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@unkey/ratelimit",
"version": "0.5.0",
"version": "0.5.1",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
Expand All @@ -9,12 +9,20 @@
"publishConfig": {
"access": "public"
},
"keywords": ["unkey", "ratelimit", "global", "serverless"],
"keywords": [
"unkey",
"ratelimit",
"global",
"serverless"
],
"bugs": {
"url": "https://github.com/unkeyed/unkey/issues"
},
"homepage": "https://github.com/unkeyed/unkey#readme",
"files": ["./dist/**", "README.md"],
"files": [
"./dist/**",
"README.md"
],
"author": "Andreas Thomas <[email protected]>",
"scripts": {
"build": "tsup"
Expand Down

0 comments on commit 85cce46

Please sign in to comment.