feat: pino logger for formbricks (#2296)

Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
This commit is contained in:
Shubham Palriwala
2024-03-22 18:51:44 +05:30
committed by GitHub
parent b72cda05c1
commit dadc337955
59 changed files with 321 additions and 92 deletions
@@ -5,6 +5,7 @@ import { getServerSession } from "next-auth";
import { canUserAccessAttributeClass } from "@formbricks/lib/attributeClass/auth";
import { authOptions } from "@formbricks/lib/authOptions";
import { getSegmentsByAttributeClassName } from "@formbricks/lib/segment/service";
import { logger } from "@formbricks/lib/utils/logger";
import { TAttributeClass } from "@formbricks/types/attributeClasses";
import { AuthorizationError } from "@formbricks/types/errors";
@@ -36,7 +37,7 @@ export const getSegmentsByAttributeClassAction = async (
return { activeSurveys, inactiveSurveys };
} catch (err) {
console.log(err);
logger.error(`Error getting segments by attribute class: ${err}`);
throw err;
}
};
+2 -1
View File
@@ -7,6 +7,7 @@ import { deleteInvite, getInvite } from "@formbricks/lib/invite/service";
import { verifyInviteToken } from "@formbricks/lib/jwt";
import { createMembership } from "@formbricks/lib/membership/service";
import { updateUser } from "@formbricks/lib/user/service";
import { logger } from "@formbricks/lib/utils/logger";
import {
ExpiredContent,
@@ -49,7 +50,7 @@ export default async function InvitePage({ searchParams }) {
return <RightAccountContent />;
}
} catch (e) {
console.error(e);
logger.error(e);
return <InvitationNotFound />;
}
}
+2 -1
View File
@@ -1,6 +1,7 @@
import { notFound, redirect } from "next/navigation";
import { getShortUrl } from "@formbricks/lib/shortUrl/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZShortUrlId } from "@formbricks/types/shortUrl";
export default async function ShortUrlPage({ params }) {
@@ -18,7 +19,7 @@ export default async function ShortUrlPage({ params }) {
try {
shortUrl = await getShortUrl(params.shortUrlId);
} catch (error) {
console.error(error);
logger.error(error);
}
if (shortUrl) {
+2 -1
View File
@@ -9,6 +9,7 @@ import {
getMonthlyTeamResponseCount,
getTeamsWithPaidPlan,
} from "@formbricks/lib/team/service";
import { logger } from "@formbricks/lib/utils/logger";
import { TTeam } from "@formbricks/types/teams";
async function reportTeamUsage(team: TTeam) {
@@ -65,7 +66,7 @@ export async function POST(): Promise<Response> {
return responses.successResponse({}, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true);
}
}
@@ -4,6 +4,7 @@ import { getServerSession } from "next-auth";
import { NextRequest } from "next/server";
import { authOptions } from "@formbricks/lib/authOptions";
import { logger } from "@formbricks/lib/utils/logger";
export async function POST(request: NextRequest) {
const session = await getServerSession(authOptions);
@@ -29,7 +30,7 @@ export async function POST(request: NextRequest) {
try {
csv = await parser.parse(json).promise();
} catch (err) {
console.log({ err });
logger.error(err);
throw new Error("Failed to convert to CSV");
}
+3 -2
View File
@@ -10,6 +10,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service";
import { getResponseCountBySurveyId } from "@formbricks/lib/response/service";
import { getSurvey, updateSurvey } from "@formbricks/lib/survey/service";
import { convertDatesInObject } from "@formbricks/lib/time";
import { logger } from "@formbricks/lib/utils/logger";
import { checkForRecallInHeadline } from "@formbricks/lib/utils/recall";
import { ZPipelineInput } from "@formbricks/types/pipelines";
import { TUserNotificationSettings } from "@formbricks/types/user";
@@ -28,7 +29,7 @@ export async function POST(request: Request) {
const inputValidation = ZPipelineInput.safeParse(jsonInput);
if (!inputValidation.success) {
console.error(inputValidation.error);
logger.error(inputValidation.error);
return responses.badRequestResponse(
"Fields are missing or incorrectly formatted",
transformErrorToDetails(inputValidation.error),
@@ -125,7 +126,7 @@ export async function POST(request: Request) {
if (usersWithNotifications.length > 0) {
if (!survey) {
console.error(`Pipeline: Survey with id ${surveyId} not found`);
logger.error(`Pipeline: Survey with id ${surveyId} not found`);
return new Response("Survey not found", {
status: 404,
});
@@ -9,6 +9,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service";
import { surveyCache } from "@formbricks/lib/survey/cache";
import { getSyncSurveys } from "@formbricks/lib/survey/service";
import { getTeamByEnvironmentId } from "@formbricks/lib/team/service";
import { logger } from "@formbricks/lib/utils/logger";
import { TJsStateSync, ZJsPeopleAttributeInput } from "@formbricks/types/js";
interface Context {
@@ -96,7 +97,7 @@ export async function POST(req: Request, context: Context): Promise<Response> {
return responses.successResponse({ ...state }, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true);
}
}
@@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { updateDisplayLegacy } from "@formbricks/lib/display/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZDisplayLegacyUpdateInput } from "@formbricks/types/displays";
export async function OPTIONS(): Promise<Response> {
@@ -30,7 +31,7 @@ export async function PUT(
const display = await updateDisplayLegacy(displayId, inputValidation.data);
return responses.successResponse(display, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message, true);
}
}
@@ -4,6 +4,7 @@ import { transformErrorToDetails } from "@/app/lib/api/validator";
import { createDisplayLegacy } from "@formbricks/lib/display/service";
import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer";
import { getSurvey } from "@formbricks/lib/survey/service";
import { logger } from "@formbricks/lib/utils/logger";
import { TDisplay, ZDisplayLegacyCreateInput } from "@formbricks/types/displays";
import { InvalidInputError } from "@formbricks/types/errors";
@@ -38,7 +39,7 @@ export async function POST(request: Request): Promise<Response> {
if (error instanceof InvalidInputError) {
return responses.badRequestResponse(error.message);
} else {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -55,7 +56,7 @@ export async function POST(request: Request): Promise<Response> {
if (error instanceof InvalidInputError) {
return responses.badRequestResponse(error.message);
} else {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -9,6 +9,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service";
import { surveyCache } from "@formbricks/lib/survey/cache";
import { getSyncSurveys } from "@formbricks/lib/survey/service";
import { getTeamByEnvironmentId } from "@formbricks/lib/team/service";
import { logger } from "@formbricks/lib/utils/logger";
import { TJsStateSync, ZJsPeopleAttributeInput } from "@formbricks/types/js";
interface Context {
@@ -95,7 +96,7 @@ export async function POST(req: Request, context: Context): Promise<Response> {
return responses.successResponse({ ...state }, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true);
}
}
@@ -4,6 +4,7 @@ import { sendToPipeline } from "@/app/lib/pipelines";
import { updateResponse } from "@formbricks/lib/response/service";
import { getSurvey } from "@formbricks/lib/survey/service";
import { logger } from "@formbricks/lib/utils/logger";
import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors";
import { ZResponseUpdateInput } from "@formbricks/types/responses";
@@ -45,7 +46,7 @@ export async function PUT(
return responses.badRequestResponse(error.message);
}
if (error instanceof DatabaseError) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -59,7 +60,7 @@ export async function PUT(
return responses.badRequestResponse(error.message);
}
if (error instanceof DatabaseError) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -7,6 +7,7 @@ import { UAParser } from "ua-parser-js";
import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer";
import { createResponseLegacy } from "@formbricks/lib/response/service";
import { getSurvey } from "@formbricks/lib/survey/service";
import { logger } from "@formbricks/lib/utils/logger";
import { InvalidInputError } from "@formbricks/types/errors";
import { TResponse, ZResponseLegacyInput } from "@formbricks/types/responses";
import { TSurvey } from "@formbricks/types/surveys";
@@ -47,7 +48,7 @@ export async function POST(request: Request): Promise<Response> {
if (error instanceof InvalidInputError) {
return responses.badRequestResponse(error.message);
} else {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -79,7 +80,7 @@ export async function POST(request: Request): Promise<Response> {
if (error instanceof InvalidInputError) {
return responses.badRequestResponse(error.message);
} else {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -6,6 +6,7 @@ import { createAttributeClass, getAttributeClassByName } from "@formbricks/lib/a
import { personCache } from "@formbricks/lib/person/cache";
import { getPerson, updatePersonAttribute } from "@formbricks/lib/person/service";
import { surveyCache } from "@formbricks/lib/survey/cache";
import { logger } from "@formbricks/lib/utils/logger";
import { ZJsPeopleLegacyAttributeInput } from "@formbricks/types/js";
import { TPersonClient } from "@formbricks/types/people";
@@ -77,7 +78,7 @@ export async function POST(req: Request, { params }): Promise<Response> {
return responses.successResponse({ ...state, person }, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true);
}
}
@@ -3,6 +3,7 @@ import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { createPerson, getPersonByUserId } from "@formbricks/lib/person/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZJsPeopleUserIdInput } from "@formbricks/types/js";
export async function OPTIONS(): Promise<Response> {
@@ -39,7 +40,7 @@ export async function POST(req: Request): Promise<Response> {
const state = await getUpdatedState(environmentId, person.id);
return responses.successResponse({ ...state, person: personClient }, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true);
}
}
@@ -2,6 +2,7 @@ import { getUpdatedState } from "@/app/api/v1/(legacy)/js/sync/lib/sync";
import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { logger } from "@formbricks/lib/utils/logger";
import { ZJsSyncLegacyInput } from "@formbricks/types/js";
import { TPersonClient } from "@formbricks/types/people";
@@ -38,7 +39,7 @@ export async function POST(req: Request): Promise<Response> {
return responses.successResponse({ ...state, person }, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true);
}
}
@@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { createAction } from "@formbricks/lib/action/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZActionInput } from "@formbricks/types/actions";
interface Context {
@@ -36,7 +37,7 @@ export async function POST(req: Request, context: Context): Promise<Response> {
return responses.successResponse({}, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true);
}
}
@@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { updateDisplay } from "@formbricks/lib/display/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZDisplayUpdateInput } from "@formbricks/types/displays";
interface Context {
@@ -35,7 +36,7 @@ export async function PUT(request: Request, context: Context): Promise<Response>
await updateDisplay(displayId, inputValidation.data);
return responses.successResponse({}, true);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message, true);
}
}
@@ -3,6 +3,7 @@ import { transformErrorToDetails } from "@/app/lib/api/validator";
import { createDisplay } from "@formbricks/lib/display/service";
import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer";
import { logger } from "@formbricks/lib/utils/logger";
import { ZDisplayCreateInput } from "@formbricks/types/displays";
import { InvalidInputError } from "@formbricks/types/errors";
@@ -41,7 +42,7 @@ export async function POST(request: Request, context: Context): Promise<Response
if (error instanceof InvalidInputError) {
return responses.badRequestResponse(error.message);
} else {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -19,6 +19,7 @@ import {
getMonthlyTeamResponseCount,
getTeamByEnvironmentId,
} from "@formbricks/lib/team/service";
import { logger } from "@formbricks/lib/utils/logger";
import { isVersionGreaterThanOrEqualTo } from "@formbricks/lib/utils/version";
import { TLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TEnvironment } from "@formbricks/types/environment";
@@ -197,7 +198,7 @@ export async function GET(
"public, s-maxage=100, max-age=110, stale-while-revalidate=100, stale-if-error=100"
);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true);
}
}
@@ -15,6 +15,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service";
import { COLOR_DEFAULTS } from "@formbricks/lib/styling/constants";
import { createSurvey, getSurveys, transformToLegacySurvey } from "@formbricks/lib/survey/service";
import { getMonthlyTeamResponseCount, getTeamByEnvironmentId } from "@formbricks/lib/team/service";
import { logger } from "@formbricks/lib/utils/logger";
import { isVersionGreaterThanOrEqualTo } from "@formbricks/lib/utils/version";
import { TLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TJsStateSync, ZJsPublicSyncInput } from "@formbricks/types/js";
@@ -141,7 +142,7 @@ export async function GET(
"public, s-maxage=600, max-age=840, stale-while-revalidate=600, stale-if-error=600"
);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(`Unable to complete response: ${error.message}`, true);
}
}
@@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { createPerson, getPersonByUserId, updatePerson } from "@formbricks/lib/person/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZPersonUpdateInput } from "@formbricks/types/people";
interface Context {
@@ -69,7 +70,7 @@ export async function POST(req: Request, context: Context): Promise<Response> {
true
);
} catch (error) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true);
}
}
@@ -5,6 +5,7 @@ import { sendToPipeline } from "@/app/lib/pipelines";
import { getPerson } from "@formbricks/lib/person/service";
import { updateResponse } from "@formbricks/lib/response/service";
import { getSurvey } from "@formbricks/lib/survey/service";
import { logger } from "@formbricks/lib/utils/logger";
import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors";
import { ZResponseUpdateInput } from "@formbricks/types/responses";
@@ -53,7 +54,7 @@ export async function PUT(
return responses.badRequestResponse(error.message);
}
if (error instanceof DatabaseError) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -67,7 +68,7 @@ export async function PUT(
return responses.badRequestResponse(error.message);
}
if (error instanceof DatabaseError) {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -8,6 +8,7 @@ import { getPerson } from "@formbricks/lib/person/service";
import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer";
import { createResponse } from "@formbricks/lib/response/service";
import { getSurvey } from "@formbricks/lib/survey/service";
import { logger } from "@formbricks/lib/utils/logger";
import { ZId } from "@formbricks/types/environment";
import { InvalidInputError } from "@formbricks/types/errors";
import { TResponse, ZResponseInput } from "@formbricks/types/responses";
@@ -96,7 +97,7 @@ export async function POST(request: Request, context: Context): Promise<Response
if (error instanceof InvalidInputError) {
return responses.badRequestResponse(error.message);
} else {
console.error(error);
logger.error(error);
return responses.internalServerErrorResponse(error.message);
}
}
@@ -7,6 +7,7 @@ import { connectAirtable, fetchAirtableAuthToken } from "@formbricks/lib/airtabl
import { authOptions } from "@formbricks/lib/authOptions";
import { AIRTABLE_CLIENT_ID, WEBAPP_URL } from "@formbricks/lib/constants";
import { hasUserEnvironmentAccess } from "@formbricks/lib/environment/auth";
import { logger } from "@formbricks/lib/utils/logger";
async function getEmail(token: string) {
const req_ = await fetch("https://api.airtable.com/v0/meta/whoami", {
@@ -72,7 +73,7 @@ export async function GET(req: NextRequest) {
});
return Response.redirect(`${WEBAPP_URL}/environments/${environmentId}/integrations/airtable`);
} catch (error) {
console.error(error);
logger.error(error);
responses.internalServerErrorResponse(error);
}
responses.badRequestResponse("unknown error occurred");
@@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response";
import { headers } from "next/headers";
import { getApiKeyFromKey } from "@formbricks/lib/apiKey/service";
import { logger } from "@formbricks/lib/utils/logger";
import { deleteWebhook, getWebhook } from "@formbricks/lib/webhook/service";
export async function GET(_: Request, { params }: { params: { webhookId: string } }) {
@@ -49,7 +50,7 @@ export async function DELETE(_: Request, { params }: { params: { webhookId: stri
const webhook = await deleteWebhook(params.webhookId);
return responses.successResponse(webhook);
} catch (e) {
console.error(e.message);
logger.error(e.message);
return responses.notFoundResponse("Webhook", params.webhookId);
}
}
+4 -3
View File
@@ -6,6 +6,7 @@ import { authOptions } from "@formbricks/lib/authOptions";
import { ONBOARDING_DISABLED } from "@formbricks/lib/constants";
import { getFirstEnvironmentByUserId } from "@formbricks/lib/environment/service";
import { getTeamsByUserId } from "@formbricks/lib/team/service";
import { logger } from "@formbricks/lib/utils/logger";
import ClientLogout from "@formbricks/ui/ClientLogout";
export default async function Home() {
@@ -21,7 +22,7 @@ export default async function Home() {
const teams = await getTeamsByUserId(session.user.id);
if (!teams || teams.length === 0) {
console.error("Failed to get teams, redirecting to create-first-team");
logger.error("Failed to get teams, redirecting to create-first-team");
return redirect("/create-first-team");
}
@@ -36,11 +37,11 @@ export default async function Home() {
throw new Error("No environment found");
}
} catch (error) {
console.error("error getting environment", error);
logger.error(`error getting environment: ${error}`);
}
if (!environment) {
console.error("Failed to get first environment of user; signing out");
logger.error("Failed to get first environment of user; signing out");
return <ClientLogout />;
}
+2 -1
View File
@@ -1,3 +1,4 @@
import { logger } from "@formbricks/lib/utils/logger";
import { TResponseData } from "@formbricks/types/responses";
import { TSurveyQuestionType } from "@formbricks/types/surveys";
import { TSurvey, TSurveyQuestion } from "@formbricks/types/surveys";
@@ -31,7 +32,7 @@ export function getPrefillResponseData(
return answerObj;
}
} catch (error) {
console.log(error);
logger.error(error);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}
+3 -1
View File
@@ -5,6 +5,8 @@ import { NodeSDK } from "@opentelemetry/sdk-node";
import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { SEMRESATTRS_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
import { logger } from "@formbricks/lib/utils/logger";
export function startInstrumentationForNode(url: string) {
try {
const exporter = new OTLPTraceExporter({
@@ -22,6 +24,6 @@ export function startInstrumentationForNode(url: string) {
sdk.start();
} catch (err) {
console.error("Unable to setup Telemetry:", err);
logger.error(`Unable to setup Telemetry: ${err}`);
}
}
+2 -2
View File
@@ -18,6 +18,7 @@ import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { RATE_LIMITING_DISABLED, WEBAPP_URL } from "@formbricks/lib/constants";
import { logger } from "@formbricks/lib/utils/logger";
export async function middleware(request: NextRequest) {
const token = await getToken({ req: request });
@@ -31,7 +32,6 @@ export async function middleware(request: NextRequest) {
if (token && callbackUrl) {
return NextResponse.redirect(WEBAPP_URL + callbackUrl);
}
if (process.env.NODE_ENV !== "production" || RATE_LIMITING_DISABLED) {
return NextResponse.next();
}
@@ -62,7 +62,7 @@ export async function middleware(request: NextRequest) {
}
return res;
} catch (_e) {
console.log("Rate Limiting IP: ", ip);
logger.info(`Rate Limiting IP: ${ip}`);
return NextResponse.json({ error: "Too many requests, Please try after a while!" }, { status: 429 });
}
+1 -1
View File
@@ -18,7 +18,7 @@ const nextConfig = {
assetPrefix: process.env.ASSET_PREFIX_URL || undefined,
output: "standalone",
experimental: {
serverComponentsExternalPackages: ["@aws-sdk"],
serverComponentsExternalPackages: ["@aws-sdk","pino"],
instrumentationHook: true,
outputFileTracingIncludes: {
"app/api/js": ["../../packages/**/*"],