Skip to content

Commit

Permalink
fixup! loggerにリクエストの詳細を記録
Browse files Browse the repository at this point in the history
  • Loading branch information
MurakawaTakuya committed Jan 20, 2025
1 parent 486d49d commit 3de3845
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 93 deletions.
89 changes: 50 additions & 39 deletions functions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import resultRouter from "./routers/resultRouter";
import userRouer from "./routers/userRouter";

const app = express();
app.set("trust proxy", true); // trueにしないと全ユーザーでlimitが共通になる
app.set("trust proxy", false);
app.use(helmet());
app.use(cors());
app.use(express.json());
Expand All @@ -41,16 +41,14 @@ const verifyAppCheckToken = async (
}

try {
const decodedToken = await admin
.appCheck()
.verifyToken(appCheckToken as string);
console.log("Verified App Check Token:", decodedToken);
await admin.appCheck().verifyToken(appCheckToken as string);
return next();
} catch (error) {
logger.error({
message: `Invalid App Check token with ${appCheckToken}:`,
error,
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(401).send("Invalid App Check token.");
}
Expand All @@ -73,10 +71,10 @@ app.use(
rateLimit({
windowMs: 10 * 60 * 1000,
max: 200,
// keyGenerator: (req) => {
// const key = req.headers["x-forwarded-for"] || req.ip || "unknown";
// return Array.isArray(key) ? key[0] : key;
// },
keyGenerator: (req) => {
const key = req.headers["x-forwarded-for"] || req.ip || "unknown";
return Array.isArray(key) ? key[0] : key;
},
handler: (req, res) => {
return res
.status(429)
Expand All @@ -89,10 +87,10 @@ app.use(
rateLimit({
windowMs: 60 * 60 * 1000,
max: 500,
// keyGenerator: (req) => {
// const key = req.headers["x-forwarded-for"] || req.ip || "unknown";
// return Array.isArray(key) ? key[0] : key;
// },
keyGenerator: (req) => {
const key = req.headers["x-forwarded-for"] || req.ip || "unknown";
return Array.isArray(key) ? key[0] : key;
},
handler: (req, res) => {
return res
.status(429)
Expand Down Expand Up @@ -121,30 +119,28 @@ export {
} from "./tasks";

// テスト用API
app.use(
"/helloWorld",
rateLimit({
// 10分に最大10回に制限
windowMs: 10 * 60 * 1000,
max: 10,
// keyGenerator: (req) => {
// const key = req.headers["x-forwarded-for"] || req.ip || "unknown";
// return Array.isArray(key) ? key[0] : key;
// },
handler: (req, res) => {
return res
.status(429)
.json({ message: "Too many requests, please try again later." });
},
})
);
const helloWorldRateLimiter = rateLimit({
windowMs: 10 * 60 * 1000, // 10分
max: 10, // 最大10回
keyGenerator: (req) => {
const key = req.headers["x-forwarded-for"] || req.ip || "unknown";
return Array.isArray(key) ? key[0] : key;
},
handler: (req, res) => {
return res
.status(429)
.json({ message: "Too many requests, please try again later." });
},
});

export const helloWorld = onRequest({ region: region }, (req, res) => {
logger.info({
message: "Hello log!",
...getRequestData(req),
export const helloWorld = onRequest({ region: region }, async (req, res) => {
helloWorldRateLimiter(req, res, async () => {
logger.info({
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
res.send("Hello World!");
});
res.send("Hello World!");
});

const db = admin.firestore();
Expand Down Expand Up @@ -177,16 +173,31 @@ export const beforecreated = beforeUserCreated(
}
);

// リクエストのheader, parameters, bodyを取得
export const getRequestData = (req: Request) => {
// requestLog
return {
ip: req.ip,
headers: req.headers,
requestMethod: req.method,
status: req.statusCode,
parameters: {
query: req.query,
params: req.params,
},
body: req.body,
};
};

// リクエストのhttp情報を取得
export const getHttpRequestData = (req: Request) => {
// httpRequest
const statusCode = req.statusCode || "202";
return {
requestMethod: req.method,
requestUrl: `${req.method} ${statusCode}: ${req.protocol}://${req.get(
"host"
)}${req.originalUrl}`,
status: statusCode,
userAgent: req.get("User-Agent"),
remoteIp: req.ip,
protocol: req.httpVersion ? `HTTP/${req.httpVersion}` : req.protocol,
};
};
73 changes: 55 additions & 18 deletions functions/src/routers/goalRouter.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import express, { Request, Response } from "express";
import admin from "firebase-admin";
import { logger } from "firebase-functions";
import { getRequestData } from "..";
import { getHttpRequestData, getRequestData } from "..";
import { Goal, GoalWithId } from "../types";

const router = express.Router();
Expand All @@ -11,8 +11,8 @@ const db = admin.firestore();
router.get("/", async (req: Request, res: Response) => {
try {
logger.info({
message: "Get: goal/",
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
const goalSnapshot = await db.collection("goal").get();

Expand All @@ -34,7 +34,11 @@ router.get("/", async (req: Request, res: Response) => {

return res.json(goalData);
} catch (error) {
logger.error({ error, ...getRequestData(req) });
logger.error({
error,
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(500).json({ message: "Error fetching goals" });
}
});
Expand All @@ -44,8 +48,8 @@ router.get("/:userId", async (req: Request, res: Response) => {
try {
const userId = req.params.userId;
logger.info({
message: `Get: goal/${userId}`,
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});

const goalSnapshot = await db
Expand Down Expand Up @@ -73,7 +77,11 @@ router.get("/:userId", async (req: Request, res: Response) => {

return res.json(goalData);
} catch (error) {
logger.error({ error, ...getRequestData(req) });
logger.error({
error,
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(500).json({ message: "Error fetching goals" });
}
});
Expand All @@ -86,9 +94,16 @@ router.post("/", async (req: Request, res: Response) => {

try {
({ userId, deadline, text } = req.body as Goal);
logger.info({ message: `Post: goal/${userId}`, ...getRequestData(req) });
logger.info({
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
} catch (error) {
logger.error({ error, ...getRequestData(req) });
logger.error({
error,
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(400).json({ message: "Invalid request body" });
}

Expand All @@ -114,21 +129,29 @@ router.post("/", async (req: Request, res: Response) => {
logger.info({
message: "Goal created successfully",
goalId,
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res
.status(201)
.json({ message: "Goal created successfully", goalId });
} catch (error) {
logger.error({ error, ...getRequestData(req) });
logger.error({
error,
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(500).json({ message: "Error creating goal" });
}
});

// PUT: 目標を更新
router.put("/:goalId", async (req: Request, res: Response) => {
const goalId = req.params.goalId;
logger.info({ message: `PUT: goal/${goalId}`, ...getRequestData(req) });
logger.info({
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
const { userId, deadline, text }: Partial<Goal> = req.body;

if (!goalId) {
Expand Down Expand Up @@ -161,11 +184,16 @@ router.put("/:goalId", async (req: Request, res: Response) => {
logger.info({
message: "Goal updated successfully",
goalId,
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.json({ message: "Goal updated successfully", goalId });
} catch (error) {
logger.error({ error, ...getRequestData(req) });
logger.error({
error,
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(500).json({ message: "Error updating goal" });
}
});
Expand All @@ -174,7 +202,10 @@ router.put("/:goalId", async (req: Request, res: Response) => {
router.delete("/:goalId", async (req: Request, res: Response) => {
try {
const goalId = req.params.goalId;
logger.info({ message: `DELETE: goal/${goalId}`, ...getRequestData(req) });
logger.info({
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});

if (!goalId) {
return res.status(400).json({ message: "goalId is required" });
Expand All @@ -198,7 +229,8 @@ router.delete("/:goalId", async (req: Request, res: Response) => {
} catch (error) {
logger.error({
error: `Error deleting image: ${error}`,
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(500).json({ message: "Error deleting image" });
}
Expand All @@ -208,11 +240,16 @@ router.delete("/:goalId", async (req: Request, res: Response) => {
logger.info({
message: "Goal deleted successfully",
goalId,
...getRequestData(req),
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.json({ message: "Goal deleted successfully", goalId });
} catch (error) {
logger.error({ error, ...getRequestData(req) });
logger.error({
error,
httpRequest: getHttpRequestData(req),
requestLog: getRequestData(req),
});
return res.status(500).json({ message: "Error deleting goal" });
}
});
Expand Down
Loading

0 comments on commit 3de3845

Please sign in to comment.