Skip to content

Commit d122ac7

Browse files
author
wtao
committed
prepare serverless
1 parent ac57074 commit d122ac7

File tree

6 files changed

+109
-41
lines changed

6 files changed

+109
-41
lines changed

.vscode/launch.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,23 @@
1313
],
1414
"program": "${workspaceFolder}/backend/index.mjs",
1515
"envFile": "${workspaceFolder}/backend/.envrc"
16+
},
17+
{
18+
"type": "node",
19+
"request": "launch",
20+
"name": "Launch sls Program",
21+
"skipFiles": [
22+
"<node_internals>/**"
23+
],
24+
"cwd": "${workspaceFolder}/backend",
25+
"runtimeExecutable": "npm",
26+
"runtimeArgs": [
27+
"run",
28+
"sls-debug"
29+
],
30+
"attachSimplePort": 9229,
31+
"sourceMaps": true,
32+
"envFile": "${workspaceFolder}/backend/.envrc"
1633
}
1734
]
1835
}

backend/express.mjs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { MongoClient } from "mongodb";
2+
import * as Query from "./query.mjs";
3+
import * as Mongo from "./mongo.mjs";
4+
5+
// grafana: test datasource connect
6+
export const dbConfig = async (req, res) => {
7+
let client = null;
8+
try {
9+
client = new MongoClient(req.body.db.url);
10+
await client.connect();
11+
res.send({
12+
status: "success",
13+
message: "MongoDB Connection test OK",
14+
});
15+
} catch (err) {
16+
res.send({
17+
status: "error",
18+
message: "MongoDB Connection Error: " + err.message,
19+
});
20+
} finally {
21+
client?.close();
22+
}
23+
};
24+
25+
// grafana: qeury
26+
export const dbQuery = async (req, res, next) => {
27+
try {
28+
const results = await Promise.all(
29+
req.body.targets.map(async (target) => {
30+
const queryArgs = Query.parseQuery(req, target);
31+
const result = await Mongo.aggregate(
32+
req.body.db.url,
33+
req.body.db.db,
34+
queryArgs
35+
);
36+
return result;
37+
})
38+
);
39+
res.json(results);
40+
} catch (err) {
41+
next(err);
42+
}
43+
};

backend/index-sls.mjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import express from "express";
2+
import serverless from "serverless-http";
3+
import { dbConfig, dbQuery } from "./express.mjs";
4+
5+
const app = express();
6+
app.use(express.json());
7+
8+
// grafana: test datasource connect
9+
app.all("/", dbConfig);
10+
11+
// grafana: qeury
12+
app.all("/query", dbQuery);
13+
14+
//default error handler
15+
app.use((err, req, res, next) => {
16+
console.error(err.stack);
17+
res.status(500).send(err.message ?? "unknown error");
18+
});
19+
20+
export const handler = serverless(app);

backend/index.mjs

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,16 @@
11
import express from "express";
2-
import { MongoClient } from "mongodb";
3-
import * as Query from "./query.mjs";
4-
import * as Mongo from "./mongo.mjs";
52
import cors from "cors";
3+
import { dbConfig, dbQuery } from "./express.mjs";
64

75
const app = express();
86
app.use(express.json());
97
app.use(cors());
108

119
// grafana: test datasource connect
12-
app.all("/", async (req, res) => {
13-
let client = null;
14-
try {
15-
client = new MongoClient(req.body.db.url);
16-
await client.connect();
17-
res.send({
18-
status: "success",
19-
message: "MongoDB Connection test OK",
20-
});
21-
} catch (err) {
22-
res.send({
23-
status: "error",
24-
message: "MongoDB Connection Error: " + err.message,
25-
});
26-
} finally {
27-
client?.close();
28-
}
29-
});
10+
app.all("/", dbConfig);
3011

3112
// grafana: qeury
32-
app.all("/query", async (req, res, next) => {
33-
try {
34-
const results = await Promise.all(
35-
req.body.targets.map(async (target) => {
36-
const queryArgs = Query.parseQuery(req, target);
37-
const result = await Mongo.aggregate(
38-
req.body.db.url,
39-
req.body.db.db,
40-
queryArgs
41-
);
42-
return result;
43-
})
44-
);
45-
res.json(results);
46-
} catch (err) {
47-
next(err);
48-
}
49-
});
13+
app.all("/query", dbQuery);
5014

5115
//default error handler
5216
app.use((err, req, res, next) => {

backend/package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
"main": "index.mjs",
66
"scripts": {
77
"start": "node index.mjs",
8-
"test": "echo \"Error: no test specified\" && exit 1"
8+
"test": "echo \"Error: no test specified\" && exit 1",
9+
"sls-debug": "export SLS_DEBUG=* && node --inspect node_modules/serverless/bin/serverless offline"
910
},
1011
"author": "",
1112
"license": "ISC",
1213
"dependencies": {
1314
"cors": "^2.8.5",
1415
"express": "^4.19.2",
15-
"mongodb": "^6.5.0"
16+
"mongodb": "^6.5.0",
17+
"serverless-http": "^3.2.0",
18+
"serverless-offline": "^13.5.0"
1619
}
1720
}

backend/serverless.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
service: lambda-mongo-grafana
3+
4+
provider:
5+
name: aws
6+
runtime: nodejs16.x
7+
stage: default
8+
region: us-west-2
9+
10+
plugins:
11+
- serverless-offline
12+
13+
custom:
14+
serverless-offline:
15+
httpPort: 4000
16+
17+
functions:
18+
app:
19+
handler: index-sls.handler
20+
events:
21+
- http: 'ANY /{ANY+}'

0 commit comments

Comments
 (0)