{"id":86392,"date":"2024-12-02T00:51:04","date_gmt":"2024-12-01T21:21:04","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/"},"modified":"2024-12-02T00:51:04","modified_gmt":"2024-12-01T21:21:04","slug":"distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/","title":{"rendered":"\u0631\u062f\u06cc\u0627\u0628\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0628\u0627 OpenTelemetry \u0648 Jaeger \u0628\u0631\u0627\u06cc Nest Application"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>  \u0645\u0642\u062f\u0645\u0647<\/p>\n<p>\u0622\u06cc\u0627 \u062a\u0627 \u0628\u0647 \u062d\u0627\u0644 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u067e\u06cc\u0634 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0634\u06a9\u0627\u0644\u06cc \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f \u0631\u062e \u062f\u0627\u062f\u0647 \u0628\u0627\u0634\u062f \u0648 \u0647\u06cc\u0686 \u0627\u06cc\u062f\u0647 \u0627\u06cc \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0686\u0647 \u0645\u0634\u06a9\u0644\u06cc \u0631\u062e \u062f\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u0632\u06cc\u0631\u0627 \u06af\u0632\u0627\u0631\u0634 \u0647\u0627\u06cc \u0634\u0645\u0627 \u062f\u0642\u06cc\u0642\u0627\u064b \u0628\u0647 \u0634\u0645\u0627 \u0646\u0645\u06cc \u06af\u0648\u06cc\u062f \u06a9\u0647 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u0631\u062e \u062f\u0627\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u067e\u0631\u062f\u0627\u0632\u0634 \u0622\u0646 \u0637\u0648\u0644 \u0645\u06cc \u06a9\u0634\u062f.<\/p>\n<p>\u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0627\u06cc\u0646 \u0645\u0633\u0627\u0626\u0644 \u0628\u062f\u0648\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0631\u062f\u06cc\u0627\u0628\u06cc \u063a\u06cc\u0631\u0645\u0645\u06a9\u0646 \u0627\u0633\u062a. \u0633\u06cc\u0633\u062a\u0645 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u0627\u0646\u0646\u062f \u06cc\u06a9 \u062f\u0648\u0631\u0628\u06cc\u0646 \u0645\u062f\u0627\u0631\u0628\u0633\u062a\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0636\u0628\u0637 \u0645\u06cc \u06a9\u0646\u062f \u0686\u0647 \u0627\u062a\u0641\u0627\u0642\u06cc \u0627\u0641\u062a\u0627\u062f\u060c \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0627\u062a\u0641\u0627\u0642 \u0627\u0641\u062a\u0627\u062f\u060c \u062a\u0631\u062a\u06cc\u0628 \u0648\u0642\u0627\u06cc\u0639 \u0686\u06af\u0648\u0646\u0647 \u0628\u0648\u062f\u060c \u0647\u0631 \u0631\u0648\u06cc\u062f\u0627\u062f \u0686\u0642\u062f\u0631 \u0637\u0648\u0644 \u06a9\u0634\u06cc\u062f. \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0631\u0627\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06af\u0644\u0648\u06af\u0627\u0647 \u0647\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u062d\u06cc\u0627\u062a\u06cc \u0627\u0633\u062a.<\/p>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632<\/p>\n<p>NodeJS<br \/>\n\u062a\u0627\u06cc\u067e \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a<br \/>\nNestJS<br \/>\n\u062f\u0627\u06a9\u0631<\/p>\n<p>  \u0627\u0635\u0637\u0644\u0627\u062d\u0627\u062a<\/p>\n<p>\u0631\u062f\u06cc\u0627\u0628\u06cc: \u06cc\u06a9 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u0627\u0646\u0646\u062f \u06cc\u06a9 \u0646\u0642\u0634\u0647 \u0633\u0641\u0631 \u06a9\u0627\u0645\u0644 \u0627\u0632 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u06a9\u0644 \u0633\u06cc\u0633\u062a\u0645 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0634\u0645\u0627 \u062d\u0631\u06a9\u062a \u0645\u06cc \u06a9\u0646\u062f. \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u06af\u0632\u0627\u0631\u0634 \u0633\u0641\u0631 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0631\u0627 \u0627\u0632 \u0646\u0642\u0637\u0647 \u0634\u0631\u0648\u0639 \u062a\u0627 \u0645\u0642\u0635\u062f \u0646\u0647\u0627\u06cc\u06cc \u062e\u0648\u062f \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0647\u0631 \u062a\u0648\u0642\u0641 \u0648 \u062a\u0639\u0627\u0645\u0644 \u062f\u0631 \u0637\u0648\u0644 \u0645\u0633\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc \u06a9\u0634\u062f.<\/p>\n<p>\u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642: \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u062f \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u0644\u0647 \u0645\u062a\u0631\u06cc. \u0645\u0627\u0646\u0646\u062f \u0646\u0635\u0628 \u0631\u062f\u06cc\u0627\u0628 \u0647\u0627\u06cc GPS \u062f\u0631 \u0642\u0633\u0645\u062a \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0633\u06cc\u0633\u062a\u0645 \u0634\u0645\u0627\u0633\u062a.<br \/>\n\u0635\u0627\u062f\u0631 \u06a9\u0646\u0646\u062f\u0647: \u062c\u0632\u0621 \u0645\u0633\u0626\u0648\u0644 \u0627\u0631\u0633\u0627\u0644 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u0634\u062f\u0647 \u0628\u0647 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 Back-end \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0648 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644. \u0628\u0647 \u0622\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0633\u062a\u06cc \u0641\u06a9\u0631 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06af\u0632\u0627\u0631\u0634 \u0633\u0641\u0631 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0628\u0627\u06cc\u06af\u0627\u0646\u06cc \u0645\u0631\u06a9\u0632\u06cc \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0647\u0627\u0646\u0647:<\/p>\n<p>Root span: \u0627\u0648\u0644\u06cc\u0646 \u062f\u0647\u0627\u0646\u0647 \u062f\u0631 \u06cc\u06a9 \u0631\u062f\u06cc\u0627\u0628\u06cc \u06a9\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0644 \u0633\u0641\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u0645\u062b\u0644 \u0646\u0642\u0637\u0647 \u0634\u0631\u0648\u0639 \u0633\u0641\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627\u0633\u062a.<br \/>\nChild span: \u062f\u0647\u0627\u0646\u0647 \u0627\u06cc \u06a9\u0647 \u062f\u0631 \u06cc\u06a9 \u062f\u0647\u0627\u0646\u0647 \u062f\u06cc\u06af\u0631 \u062a\u0648\u062f\u0631\u062a\u0648 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u062e\u0627\u0635 \u062a\u0631 \u062f\u0631 \u06cc\u06a9 \u0641\u0631\u0622\u06cc\u0646\u062f \u06af\u0633\u062a\u0631\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u0646\u062a\u0634\u0627\u0631 \u0645\u062a\u0646: \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0627\u0646\u062a\u0642\u0627\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u062f\u06cc\u0627\u0628\u06cc \u0628\u06cc\u0646 \u062e\u062f\u0645\u0627\u062a \u0648 \u0627\u062c\u0632\u0627\u06cc \u0645\u062e\u062a\u0644\u0641. \u0645\u0627\u0646\u0646\u062f \u067e\u0627\u0633\u067e\u0648\u0631\u062a \u06cc\u06a9 \u0645\u0633\u0627\u0641\u0631 \u0627\u0633\u062a \u06a9\u0647 \u062d\u0627\u0648\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0645\u0644 \u0633\u0641\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u0645\u0639\u06cc\u0627\u0631\u0647\u0627: \u0645\u062a\u0631\u06cc\u06a9 \u0647\u0627 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0639\u062f\u062f\u06cc \u0647\u0633\u062a\u0646\u062f \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f\u060c \u0633\u0644\u0627\u0645\u062a \u0648 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u0646\u062f.<\/p>\n<p>\u0633\u06cc\u0627\u0647\u0647\u0647\u0627: \u06af\u0632\u0627\u0631\u0634\u200c\u0647\u0627 \u0648\u0631\u0648\u062f\u06cc\u200c\u0647\u0627\u06cc \u0645\u062a\u0646\u06cc \u0647\u0633\u062a\u0646\u062f \u06a9\u0647 \u0627\u0644\u06af\u0648\u0647\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0641\u0639\u0627\u0644\u06cc\u062a\u200c\u0647\u0627 \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062a\u0648\u0635\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<p>  \u0633\u0647 \u0633\u0648\u0627\u0631 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647<\/p>\n<p>\u0645\u0634\u0627\u0647\u062f\u0647\u200c\u067e\u0630\u06cc\u0631\u06cc \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u0632 \u0628\u06cc\u0631\u0648\u0646 \u062f\u0631\u06a9 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 \u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0628\u062f\u0648\u0646 \u0627\u0637\u0644\u0627\u0639 \u0627\u0632 \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0631\u0648\u0646\u06cc \u0622\u0646 \u0633\u0624\u0627\u0644 \u0628\u067e\u0631\u0633\u06cc\u062f. \u0627\u06cc\u0646 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0645\u0634\u06a9\u0644\u0627\u062a \u062c\u062f\u06cc\u062f \u0631\u0627 \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u062f\u060c \u06cc\u0639\u0646\u06cc &#8220;\u0646\u0627\u0634\u0646\u0627\u062e\u062a\u0647 \u0647\u0627\u06cc \u0646\u0627\u0634\u0646\u0627\u062e\u062a\u0647&#8221;. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647 \u0633\u0648\u0627\u0644 \u067e\u0627\u0633\u062e \u0645\u06cc \u062f\u0647\u062f &#8220;\u0686\u0631\u0627 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f\u061f&#8221;<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647<\/p>\n<p>pnpm i -g @nestjs\/cli<br \/>\nnest new tracing-app<br \/>\ncd tracing-app<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0646\u0635\u0628 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627<\/p>\n<p>\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0645\u0631\u062a\u0628\u0637 Jaeger \u0648 OpenTelemetry \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>pnpm install @opentelemetry\/sdk-trace-node @opentelemetry\/resources @opentelemetry\/sdk-trace-base<br \/>\npnpm install @opentelemetry\/instrumentation @prisma\/instrumentation @opentelemetry\/instrumentation-net @opentelemetry\/instrumentation-http @opentelemetry\/instrumentation-express<br \/>\npnpm install @opentelemetry\/exporter-trace-otlp-http<br \/>\npnpm install @opentelemetry\/api @opentelemetry\/semantic-conventions<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Prisma ORM \u0648 SQLite \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>pnpm install @prisma\/client sqlite3 class-validator<br \/>\npnpm install prisma &#8211;save-dev<br \/>\npnpm install &#8211;save @nestjs\/swagger<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Prisma \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>npx prisma init<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f prisma \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0627 a schema.prisma \u0641\u0627\u06cc\u0644<\/p>\n<p>datasource db {<br \/>\n  provider = &#8220;sqlite&#8221;<br \/>\n  url      = &#8220;file:.\/dev.db&#8221;<br \/>\n}<\/p>\n<p>generator client {<br \/>\n  provider = &#8220;prisma-client-js&#8221;<br \/>\n}<\/p>\n<p>model User {<br \/>\n  id    Int     @id @default(autoincrement())<br \/>\n  name  String<br \/>\n  email String  @unique<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Prisma \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>npx prisma migrate dev &#8211;name init<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06a9\u0644\u0627\u06cc\u0646\u062a Prisma \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>npx prisma generate<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc CRUD \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 CRUD \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>pnpm nest generate resource users<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f users \u0645\u0627\u0698\u0648\u0644 \u0628\u0627 \u06a9\u0646\u062a\u0631\u0644\u0631\u060c \u0633\u0631\u0648\u06cc\u0633 \u0648 DTO.<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 prisma.service.ts \u0641\u0627\u06cc\u0644 \u062f\u0631 \u067e\u0648\u0634\u0647 \u067e\u0631\u06cc\u0633\u0645\u0627<\/p>\n<p>import { Injectable, OnModuleInit, OnModuleDestroy } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { PrismaClient } from &#8216;@prisma\/client&#8217;;<\/p>\n<p>@Injectable()<br \/>\nexport class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {<br \/>\n  async onModuleInit() {<br \/>\n    await this.$connect();<br \/>\n  }<\/p>\n<p>  async onModuleDestroy() {<br \/>\n    await this.$disconnect();<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f users.module.ts \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u06af\u0646\u062c\u0627\u0646\u062f\u0646 PrismaService:<\/p>\n<p>import { Module } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { UsersService } from &#8216;.\/users.service&#8217;;<br \/>\nimport { UsersController } from &#8216;.\/users.controller&#8217;;<br \/>\nimport { PrismaService } from &#8216;..\/..\/prisma\/prisma.service&#8217;;<\/p>\n<p>@Module({<br \/>\n  controllers: [UsersController],<br \/>\n  providers: [UsersService, PrismaService],<br \/>\n})<br \/>\nexport class UsersModule { }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f create-user.dto.ts \u062f\u0631 users\/dto \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc:<\/p>\n<p>import { IsEmail, IsNotEmpty, IsString } from &#8216;class-validator&#8217;;<br \/>\nimport { ApiProperty } from &#8216;@nestjs\/swagger&#8217;;<\/p>\n<p>export class CreateUserDto {<br \/>\n    @ApiProperty({<br \/>\n        description: &#8216;The name of the user&#8217;,<br \/>\n        example: &#8216;John Doe&#8217;,<br \/>\n    })<br \/>\n    @IsNotEmpty()<br \/>\n    @IsString()<br \/>\n    name: string;<\/p>\n<p>    @ApiProperty({<br \/>\n        description: &#8216;The email of the user&#8217;,<br \/>\n        example: &#8217;email@domain.com&#8217;,<br \/>\n    })<br \/>\n    @IsNotEmpty()<br \/>\n    @IsEmail()<br \/>\n    email: string;<br \/>\n}<\/p>\n<p>export class UpdateUserDto extends PartialType(CreateUserDto) {}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f users.service.ts \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Prisma:<\/p>\n<p>import { Injectable } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { PrismaService } from &#8216;..\/prisma\/prisma.service&#8217;;<br \/>\nimport { CreateUserDto } from &#8216;.\/dto\/create-user.dto&#8217;;<br \/>\nimport { UpdateUserDto } from &#8216;.\/dto\/update-user.dto&#8217;;<\/p>\n<p>@Injectable()<br \/>\nexport class UsersService {<br \/>\n  constructor(private prisma: PrismaService) {}<\/p>\n<p>  create(createUserDto: CreateUserDto) {<br \/>\n    return this.prisma.user.create({<br \/>\n      data: createUserDto,<br \/>\n    });<br \/>\n  }<\/p>\n<p>  findAll() {<br \/>\n    return this.prisma.user.findMany();<br \/>\n  }<\/p>\n<p>  findOne(id: number) {<br \/>\n    return this.prisma.user.findUnique({<br \/>\n      where: { id },<br \/>\n    });<br \/>\n  }<\/p>\n<p>  update(id: number, updateUserDto: UpdateUserDto) {<br \/>\n    return this.prisma.user.update({<br \/>\n      where: { id },<br \/>\n      data: updateUserDto,<br \/>\n    });<br \/>\n  }<\/p>\n<p>  remove(id: number) {<br \/>\n    return this.prisma.user.delete({<br \/>\n      where: { id },<br \/>\n    });<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f users.controller.ts  \u0641\u0627\u06cc\u0644:<\/p>\n<p>import { Controller, Get, Post, Body, Patch, Param, Delete } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { UsersService } from &#8216;.\/users.service&#8217;;<br \/>\nimport { CreateUserDto } from &#8216;.\/dto\/create-user.dto&#8217;;<br \/>\nimport { UpdateUserDto } from &#8216;.\/dto\/update-user.dto&#8217;;<br \/>\nimport { ApiGoneResponse, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiParam, ApiTags } from &#8216;@nestjs\/swagger&#8217;;<\/p>\n<p>@ApiTags(&#8216;users&#8217;)<br \/>\n@Controller(&#8216;users&#8217;)<br \/>\nexport class UsersController {<br \/>\n  constructor(private readonly usersService: UsersService) { }<\/p>\n<p>  @ApiOperation({ summary: &#8216;Create user&#8217; })<br \/>\n  @ApiOkResponse({ description: &#8216;User created&#8217; })<br \/>\n  @Post()<br \/>\n  create(@Body() createUserDto: CreateUserDto) {<br \/>\n    return this.usersService.create(createUserDto);<br \/>\n  }<\/p>\n<p>  @ApiOperation({ summary: &#8216;Get all users&#8217; })<br \/>\n  @ApiOkResponse({ description: &#8216;Users found&#8217; })<br \/>\n  @Get()<br \/>\n  findAll() {<br \/>\n    return this.usersService.findAll();<br \/>\n  }<\/p>\n<p>  @ApiOperation({ summary: &#8216;Get user by id&#8217; })<br \/>\n  @ApiOkResponse({ description: &#8216;User found&#8217; })<br \/>\n  @ApiNotFoundResponse({ description: &#8216;User not found&#8217; })<br \/>\n  @ApiParam({ name: &#8216;id&#8217;, description: &#8216;User id&#8217; })<br \/>\n  @Get(&#8216;:id&#8217;)<br \/>\n  findOne(@Param(&#8216;id&#8217;) id: string) {<br \/>\n    return this.usersService.findOne(+id);<br \/>\n  }<\/p>\n<p>  @ApiOperation({ summary: &#8216;Update user&#8217; })<br \/>\n  @ApiOkResponse({ description: &#8216;User updated&#8217; })<br \/>\n  @ApiNotFoundResponse({ description: &#8216;User not found&#8217; })<br \/>\n  @ApiParam({ name: &#8216;id&#8217;, description: &#8216;User id&#8217; })<br \/>\n  @Patch(&#8216;:id&#8217;)<br \/>\n  update(@Param(&#8216;id&#8217;) id: string, @Body() updateUserDto: UpdateUserDto) {<br \/>\n    return this.usersService.update(+id, updateUserDto);<br \/>\n  }<\/p>\n<p>  @ApiOperation({ summary: &#8216;Delete user&#8217; })<br \/>\n  @ApiGoneResponse({ description: &#8216;User deleted&#8217; })<br \/>\n  @ApiParam({ name: &#8216;id&#8217;, description: &#8216;User id&#8217; })<br \/>\n  @Delete(&#8216;:id&#8217;)<br \/>\n  remove(@Param(&#8216;id&#8217;) id: string) {<br \/>\n    return this.usersService.remove(+id);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0635\u0627\u062f\u0631\u06a9\u0646\u0646\u062f\u06af\u0627\u0646<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0631\u062f\u06cc\u0627\u0628\u06cc.ts  \u062f\u0631 \u0634\u0645\u0627 src  \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc:<\/p>\n<p>import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from &#8216;@opentelemetry\/semantic-conventions&#8217;;<br \/>\nimport { BatchSpanProcessor } from &#8216;@opentelemetry\/sdk-trace-base&#8217;;<br \/>\nimport { ExpressInstrumentation } from &#8216;@opentelemetry\/instrumentation-express&#8217;;<br \/>\nimport { HttpInstrumentation } from &#8216;@opentelemetry\/instrumentation-http&#8217;;<br \/>\nimport { NetInstrumentation } from &#8216;@opentelemetry\/instrumentation-net&#8217;;<br \/>\nimport { NodeTracerProvider } from &#8216;@opentelemetry\/sdk-trace-node&#8217;;<br \/>\nimport { OTLPTraceExporter } from &#8216;@opentelemetry\/exporter-trace-otlp-http&#8217;;<br \/>\nimport { PrismaInstrumentation } from &#8216;@prisma\/instrumentation&#8217;;<br \/>\nimport { Resource } from &#8216;@opentelemetry\/resources&#8217;;<br \/>\nimport { diag, DiagConsoleLogger, DiagLogLevel } from &#8216;@opentelemetry\/api&#8217;;<br \/>\nimport { registerInstrumentations } from &#8216;@opentelemetry\/instrumentation&#8217;;<\/p>\n<p>export function setupTracing() {<br \/>\n    \/\/ Enable OpenTelemetry diagnostic logging<br \/>\n    diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);<\/p>\n<p>    \/\/ Create a resource with service information<br \/>\n    const resource = new Resource({<br \/>\n        [ATTR_SERVICE_NAME]: process.env.SERVICE_NAME || &#8216;tracer-app&#8217;,<br \/>\n        [ATTR_SERVICE_VERSION]: process.env.npm_package_version || &#8216;1.0.0&#8217;,<br \/>\n    });<\/p>\n<p>    const otlpExporter = new OTLPTraceExporter({<br \/>\n        url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || &#8216;http:\/\/localhost:4318\/v1\/traces&#8217;,<br \/>\n    });<\/p>\n<p>    \/\/ Create tracer provider with resource and span processors<br \/>\n    const provider = new NodeTracerProvider({<br \/>\n        resource,<br \/>\n        spanProcessors: [<br \/>\n            new BatchSpanProcessor(otlpExporter, {<br \/>\n                maxQueueSize: 100,<br \/>\n                scheduledDelayMillis: 5000,<br \/>\n                exportTimeoutMillis: 30000,<br \/>\n                maxExportBatchSize: 50,<br \/>\n            })<br \/>\n        ]\n    });<\/p>\n<p>    \/\/ Register instrumentations with more comprehensive coverage<br \/>\n    registerInstrumentations({<br \/>\n        tracerProvider: provider,<br \/>\n        instrumentations: [<br \/>\n            new HttpInstrumentation({<br \/>\n                requestHook: (span, request) =&gt; {<br \/>\n                    span.setAttribute(&#8216;http.request.method&#8217;, request.method);<br \/>\n                },<br \/>\n            }),<br \/>\n            new NetInstrumentation(),<br \/>\n            new ExpressInstrumentation(),<br \/>\n            new PrismaInstrumentation({ middleware: true }),<br \/>\n        ],<br \/>\n    });<\/p>\n<p>    \/\/ Register the provider<br \/>\n    provider.register();<\/p>\n<p>    \/\/ Return the provider for potential manual instrumentation<br \/>\n    return provider;<br \/>\n}<\/p>\n<p>\/\/ Call this at application startup<br \/>\nsetupTracing();<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u062a\u0648\u0636\u06cc\u062d<\/p>\n<p>\u062b\u0628\u062a \u062a\u0634\u062e\u06cc\u0635\u06cc: \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062a\u0634\u062e\u06cc\u0635\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062b\u0628\u062a\u200c\u06a9\u0646\u0646\u062f\u0647 \u06a9\u0646\u0633\u0648\u0644 \u062f\u0631 \u0642\u0633\u0645\u062a \u0641\u0639\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f INFO \u0633\u0637\u062d \u0628\u0631\u0627\u06cc \u0631\u0641\u0639 \u0627\u0634\u06a9\u0627\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0631\u062f\u06cc\u0627\u0628\u06cc.<\/p>\n<p>\u0627\u0648\u0644\u06cc\u0647 \u0633\u0627\u0632\u06cc \u0645\u0646\u0627\u0628\u0639:<\/p>\n<p>\u0645\u062a\u0627\u062f\u06cc\u062a\u0627 \u0631\u0627 \u062f\u0631\u0628\u0627\u0631\u0647 \u0633\u0631\u0648\u06cc\u0633 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0645\u0627\u0646\u0646\u062f SERVICE_NAME \u0648 SERVICE_VERSION.<br \/>\n\u0627\u06cc\u0646 \u0627\u0628\u0631\u062f\u0627\u062f\u0647 \u0628\u0647 \u0647\u0631 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0628\u0647 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u062e\u062f\u0645\u0627\u062a\u06cc \u06a9\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u062a\u0639\u0644\u0642 \u0627\u0633\u062a \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0635\u0627\u062f\u0631\u06a9\u0646\u0646\u062f\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc OTLP: \u067e\u0631\u0648\u062a\u06a9\u0644 OpenTelemetry \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f (OTLP) \u0635\u0627\u062f\u0631 \u06a9\u0646\u0646\u062f\u0647 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0628\u0647 \u0628\u0627\u0637\u0646 \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 Jaeger \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f HTTP  \u067e\u0631\u0648\u062a\u06a9\u0644 \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 Jaeger \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0627 \u0628\u0627\u0637\u0646 \u062f\u06cc\u06af\u0631\u06cc \u0645\u0627\u0646\u0646\u062f Honeycomb\u060c Zipkin \u0648 \u063a\u06cc\u0631\u0647 \u062a\u0639\u0648\u06cc\u0636 \u06a9\u0631\u062f \u0648 \u0634\u0645\u0627 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0631\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0622\u0645\u062f\u062a\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f. GRPC \u0627\u0632 \u062c\u0627\u0631\u06cc HTTP.<\/p>\n<p>\u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 Tracer \u0628\u0627 \u067e\u0631\u062f\u0627\u0632\u0646\u062f\u0647 Span: a \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f NodeTracerProvider\u060c \u06a9\u0647 \u0631\u062f\u06cc\u0627\u0628 \u0647\u0627 \u0648 \u06af\u0633\u062a\u0631\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<p>\u062b\u0628\u062a \u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642: \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0631\u062f\u06cc\u0627\u0628\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627 \u0648 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627 \u0631\u0627 \u0645\u06cc \u06af\u06cc\u0631\u062f:<\/p>\n<p>HttpInstrumentation: \u0632\u0645\u0627\u0646 \u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\/\u067e\u0627\u0633\u062e \u0647\u0627\u06cc HTTP \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>NetInstrumentation: \u0632\u0645\u0627\u0646 \u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0633\u0637\u062d \u067e\u0627\u06cc\u06cc\u0646 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>ExpressInstrumentation: \u0632\u0645\u0627\u0646 \u0645\u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 Express \u0648 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>PrismaInstrumentation: \u0632\u0645\u0627\u0646 \u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u067e\u0631\u0633\u0634 \u0647\u0627\u06cc SQL \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 Prisma \u0631\u0627 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f<\/p>\n<p>  \u06a9\u062f \u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0648 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0627\u0648\u0644\u06cc\u0647 \u06a9\u0646\u06cc\u062f main.ts:<\/p>\n<p>import { NestFactory } from &#8216;@nestjs\/core&#8217;;<br \/>\nimport { SwaggerModule, DocumentBuilder } from &#8216;@nestjs\/swagger&#8217;;<br \/>\nimport { AppModule } from &#8216;.\/app.module&#8217;;<br \/>\nimport &#8216;.\/tracing&#8217;;<\/p>\n<p>async function bootstrap() {<br \/>\n  const app = await NestFactory.create(AppModule);<\/p>\n<p>  const config = new DocumentBuilder()<br \/>\n    .setTitle(&#8216;Tracing example&#8217;)<br \/>\n    .setDescription(&#8216;The tracing API description&#8217;)<br \/>\n    .setVersion(&#8216;1.0&#8217;)<br \/>\n    .addTag(&#8216;tracing&#8217;)<br \/>\n    .build();<br \/>\n  const documentFactory = () =&gt; SwaggerModule.createDocument(app, config);<br \/>\n  SwaggerModule.setup(&#8216;api-docs&#8217;, app, documentFactory);<\/p>\n<p>  await app.listen(process.env.PORT ?? 3000);<br \/>\n}<br \/>\nbootstrap();<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<p>pnpm run start:dev<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u062a\u0646\u0638\u06cc\u0645 Jaeger \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647<\/p>\n<p>\u0633\u0627\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0631\u0627\u0647 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Jaeger \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0648\u06cc\u0646\u0686 docker-compose \u062f\u0631 \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647 \u0628\u0647 \u062e\u0648\u0628\u06cc \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f docker-compose.yaml \u0641\u0627\u06cc\u0644:<\/p>\n<p>services:<br \/>\n  jaeger:<br \/>\n    image: jaegertracing\/all-in-one:1.63.0<br \/>\n    container_name: jaeger<br \/>\n    environment:<br \/>\n      COLLECTOR_OTLP_ENABLED: &#8220;true&#8221;<br \/>\n    ports:<br \/>\n      &#8211; &#8220;4317:4317&#8221; # For Jaeger-GRPC<br \/>\n      &#8211; &#8220;4318:4318&#8221; # For Jaeger-HTTP<br \/>\n      &#8211; &#8220;16686:16686&#8221; # # Web UI<\/p>\n<p>networks:<br \/>\n  default:<br \/>\n    driver: bridge<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0628\u0631\u0646\u0627\u0645\u0647 Containerize (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc)<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f docker init \u0627\u06af\u0631 \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f\u062a\u0631 Docker \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u062f\u0633\u062a\u0648\u0631 \u062a\u0648\u0644\u06cc\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u06cc\u06a9 Dockerfile \u0628\u0647\u06cc\u0646\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0635\u0627\u062f\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<p># Arguments for versions<br \/>\nARG NODE_VERSION=20.18.0<br \/>\nARG PNPM_VERSION=9.12.2<br \/>\nARG ALPINE_VERSION=3.20<\/p>\n<p>################################################################################<br \/>\n# Base stage: Build the application<br \/>\nFROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS builder<\/p>\n<p># Set working directory<br \/>\nWORKDIR \/usr\/src\/app<\/p>\n<p># Install pnpm globally with cache<br \/>\nRUN &#8211;mount=type=cache,target=\/root\/.npm \\<br \/>\n    npm install -g pnpm@${PNPM_VERSION}<\/p>\n<p># Copy package.json and pnpm-lock.yaml to install dependencies<br \/>\nCOPY ..\/package.json pnpm-lock.yaml .\/<\/p>\n<p># Install dependencies with cache<br \/>\nRUN &#8211;mount=type=cache,target=\/root\/.pnpm-store \\<br \/>\n    pnpm install &#8211;frozen-lockfile<\/p>\n<p># Copy the all application code<br \/>\nCOPY .. .<\/p>\n<p># Setup prisma<br \/>\nRUN pnpm prisma generate<\/p>\n<p># Build the application<br \/>\nRUN pnpm run build<\/p>\n<p># Runner Stage<br \/>\nFROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS runner<\/p>\n<p># Set working directory<br \/>\nWORKDIR \/usr\/src\/app<\/p>\n<p># Copy the built application from the builder stage<br \/>\nCOPY &#8211;from=builder \/usr\/src\/app\/dist .\/dist<br \/>\nCOPY ..\/package.json pnpm-lock.yaml .\/<br \/>\nCOPY ..\/prisma\/schema.prisma .\/prisma\/schema.prisma<\/p>\n<p># Install pnpm globally<br \/>\nRUN &#8211;mount=type=cache,target=\/root\/.npm \\<br \/>\n    npm install -g pnpm@${PNPM_VERSION}<\/p>\n<p># Install dependencies with cache<br \/>\nRUN &#8211;mount=type=cache,target=\/root\/.pnpm-store \\<br \/>\n    pnpm install &#8211;frozen-lockfile &#8211;prod<\/p>\n<p># Set NODE_ENV to production<br \/>\nENV NODE_ENV=production<\/p>\n<p># Run the application<br \/>\nCMD [&#8220;pnpm&#8221;, &#8220;run&#8221;, &#8220;start:prod&#8221;]\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  Swagger UI<\/p>\n<p>\u0627\u0632 http:\/\/localhost:3000\/api-docs \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f \u0648 \u0686\u0646\u062f \u062a\u0645\u0627\u0633 API \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \u062a\u062c\u0633\u0645 \u0622\u062b\u0627\u0631<\/p>\n<p>\u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 http:\/\/localhost:16686 \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc Jaeger. \u0686\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u0631\u062f\u06cc\u0627\u0628\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0648\u06cc \u06cc\u06a9 Trace \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f<\/p>\n<div data-article-id=\"2129735\" id=\"article-body\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D9%85%D9%82%D8%AF%D9%85%D9%87\" >\u0645\u0642\u062f\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD%D8%A7%D8%AA\" >\u0627\u0635\u0637\u0644\u0627\u062d\u0627\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%B3%D9%87_%D8%B3%D9%88%D8%A7%D8%B1_%D9%82%D8%A7%D8%A8%D9%84_%D9%85%D8%B4%D8%A7%D9%87%D8%AF%D9%87\" >\u0633\u0647 \u0633\u0648\u0627\u0631 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D9%86%D8%B5%D8%A8_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7\" >\u0646\u0635\u0628 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%DB%8C%DA%A9_%D9%86%D9%82%D8%B7%D9%87_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C_CRUD_%D8%B1%D8%A7_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%DA%A9%D9%86%DB%8C%D8%AF\" >\u06cc\u06a9 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc CRUD \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%B5%D8%A7%D8%AF%D8%B1%DA%A9%D9%86%D9%86%D8%AF%DA%AF%D8%A7%D9%86\" >\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0635\u0627\u062f\u0631\u06a9\u0646\u0646\u062f\u06af\u0627\u0646<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%AA%D9%88%D8%B6%DB%8C%D8%AD\" >\u062a\u0648\u0636\u06cc\u062d<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%DA%A9%D8%AF_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1_%D8%AF%D9%82%DB%8C%D9%82_%D8%B1%D8%A7_%D8%AF%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D9%88%D8%A7%D8%B1%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u06a9\u062f \u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%AA%D9%86%D8%B8%DB%8C%D9%85_Jaeger_%D8%A8%D8%B1%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7_%D8%AA%D9%88%D8%B3%D8%B9%D9%87\" >\u062a\u0646\u0638\u06cc\u0645 Jaeger \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Containerize_%D8%A7%D8%AE%D8%AA%DB%8C%D8%A7%D8%B1%DB%8C\" >\u0628\u0631\u0646\u0627\u0645\u0647 Containerize (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#Swagger_UI\" >Swagger UI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/distributed-tracing-with-opentelemetry-and-jaeger-for-nest-application-3c68\/#%D8%AA%D8%AC%D8%B3%D9%85_%D8%A2%D8%AB%D8%A7%D8%B1\" >\u062a\u062c\u0633\u0645 \u0622\u062b\u0627\u0631<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\"><\/span>\n<p>  \u0645\u0642\u062f\u0645\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0622\u06cc\u0627 \u062a\u0627 \u0628\u0647 \u062d\u0627\u0644 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u067e\u06cc\u0634 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0634\u06a9\u0627\u0644\u06cc \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f \u0631\u062e \u062f\u0627\u062f\u0647 \u0628\u0627\u0634\u062f \u0648 \u0647\u06cc\u0686 \u0627\u06cc\u062f\u0647 \u0627\u06cc \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0686\u0647 \u0645\u0634\u06a9\u0644\u06cc \u0631\u062e \u062f\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u0632\u06cc\u0631\u0627 \u06af\u0632\u0627\u0631\u0634 \u0647\u0627\u06cc \u0634\u0645\u0627 \u062f\u0642\u06cc\u0642\u0627\u064b \u0628\u0647 \u0634\u0645\u0627 \u0646\u0645\u06cc \u06af\u0648\u06cc\u062f \u06a9\u0647 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u0631\u062e \u062f\u0627\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u06a9\u0647 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u067e\u0631\u062f\u0627\u0632\u0634 \u0622\u0646 \u0637\u0648\u0644 \u0645\u06cc \u06a9\u0634\u062f.<\/p>\n<p>\u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0627\u06cc\u0646 \u0645\u0633\u0627\u0626\u0644 \u0628\u062f\u0648\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0631\u062f\u06cc\u0627\u0628\u06cc \u063a\u06cc\u0631\u0645\u0645\u06a9\u0646 \u0627\u0633\u062a. \u0633\u06cc\u0633\u062a\u0645 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u0627\u0646\u0646\u062f \u06cc\u06a9 \u062f\u0648\u0631\u0628\u06cc\u0646 \u0645\u062f\u0627\u0631\u0628\u0633\u062a\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0636\u0628\u0637 \u0645\u06cc \u06a9\u0646\u062f <em>\u0686\u0647 \u0627\u062a\u0641\u0627\u0642\u06cc \u0627\u0641\u062a\u0627\u062f\u060c \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc \u0627\u062a\u0641\u0627\u0642 \u0627\u0641\u062a\u0627\u062f\u060c \u062a\u0631\u062a\u06cc\u0628 \u0648\u0642\u0627\u06cc\u0639 \u0686\u06af\u0648\u0646\u0647 \u0628\u0648\u062f\u060c \u0647\u0631 \u0631\u0648\u06cc\u062f\u0627\u062f \u0686\u0642\u062f\u0631 \u0637\u0648\u0644 \u06a9\u0634\u06cc\u062f<\/em>. \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u0631\u0627\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06af\u0644\u0648\u06af\u0627\u0647 \u0647\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u062d\u06cc\u0627\u062a\u06cc \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\n<p>NodeJS<\/p>\n<\/li>\n<li>\n<p>\u062a\u0627\u06cc\u067e \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a<\/p>\n<\/li>\n<li>\n<p>NestJS<\/p>\n<\/li>\n<li>\n<p>\u062f\u0627\u06a9\u0631<\/p>\n<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD%D8%A7%D8%AA\"><\/span>\n<p>  \u0627\u0635\u0637\u0644\u0627\u062d\u0627\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\n<strong>\u0631\u062f\u06cc\u0627\u0628\u06cc<\/strong>: \u06cc\u06a9 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u0627\u0646\u0646\u062f \u06cc\u06a9 \u0646\u0642\u0634\u0647 \u0633\u0641\u0631 \u06a9\u0627\u0645\u0644 \u0627\u0632 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u06a9\u0644 \u0633\u06cc\u0633\u062a\u0645 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0634\u0645\u0627 \u062d\u0631\u06a9\u062a \u0645\u06cc \u06a9\u0646\u062f. \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u06af\u0632\u0627\u0631\u0634 \u0633\u0641\u0631 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0631\u0627 \u0627\u0632 \u0646\u0642\u0637\u0647 \u0634\u0631\u0648\u0639 \u062a\u0627 \u0645\u0642\u0635\u062f \u0646\u0647\u0627\u06cc\u06cc \u062e\u0648\u062f \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0647\u0631 \u062a\u0648\u0642\u0641 \u0648 \u062a\u0639\u0627\u0645\u0644 \u062f\u0631 \u0637\u0648\u0644 \u0645\u0633\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc \u06a9\u0634\u062f.<\/li>\n<\/ul>\n<p><\/p>\n<ul>\n<li>\n<p><strong>\u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642<\/strong>: \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u062f \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u0644\u0647 \u0645\u062a\u0631\u06cc. \u0645\u0627\u0646\u0646\u062f \u0646\u0635\u0628 \u0631\u062f\u06cc\u0627\u0628 \u0647\u0627\u06cc GPS \u062f\u0631 \u0642\u0633\u0645\u062a \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0633\u06cc\u0633\u062a\u0645 \u0634\u0645\u0627\u0633\u062a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0635\u0627\u062f\u0631 \u06a9\u0646\u0646\u062f\u0647<\/strong>: \u062c\u0632\u0621 \u0645\u0633\u0626\u0648\u0644 \u0627\u0631\u0633\u0627\u0644 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u0634\u062f\u0647 \u0628\u0647 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 Back-end \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0648 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644. \u0628\u0647 \u0622\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0633\u062a\u06cc \u0641\u06a9\u0631 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06af\u0632\u0627\u0631\u0634 \u0633\u0641\u0631 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0628\u0627\u06cc\u06af\u0627\u0646\u06cc \u0645\u0631\u06a9\u0632\u06cc \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<\/li>\n<li>\n<p><strong>\u062f\u0647\u0627\u0646\u0647:<\/strong><\/p>\n<ul>\n<li>Root span: \u0627\u0648\u0644\u06cc\u0646 \u062f\u0647\u0627\u0646\u0647 \u062f\u0631 \u06cc\u06a9 \u0631\u062f\u06cc\u0627\u0628\u06cc \u06a9\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0644 \u0633\u0641\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u0645\u062b\u0644 \u0646\u0642\u0637\u0647 \u0634\u0631\u0648\u0639 \u0633\u0641\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627\u0633\u062a.<\/li>\n<li>Child span: \u062f\u0647\u0627\u0646\u0647 \u0627\u06cc \u06a9\u0647 \u062f\u0631 \u06cc\u06a9 \u062f\u0647\u0627\u0646\u0647 \u062f\u06cc\u06af\u0631 \u062a\u0648\u062f\u0631\u062a\u0648 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u062e\u0627\u0635 \u062a\u0631 \u062f\u0631 \u06cc\u06a9 \u0641\u0631\u0622\u06cc\u0646\u062f \u06af\u0633\u062a\u0631\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0627\u0646\u062a\u0634\u0627\u0631 \u0645\u062a\u0646:<\/strong> \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0627\u0646\u062a\u0642\u0627\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u062f\u06cc\u0627\u0628\u06cc \u0628\u06cc\u0646 \u062e\u062f\u0645\u0627\u062a \u0648 \u0627\u062c\u0632\u0627\u06cc \u0645\u062e\u062a\u0644\u0641. \u0645\u0627\u0646\u0646\u062f \u067e\u0627\u0633\u067e\u0648\u0631\u062a \u06cc\u06a9 \u0645\u0633\u0627\u0641\u0631 \u0627\u0633\u062a \u06a9\u0647 \u062d\u0627\u0648\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0645\u0644 \u0633\u0641\u0631 \u0627\u0633\u062a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0639\u06cc\u0627\u0631\u0647\u0627<\/strong>: \u0645\u062a\u0631\u06cc\u06a9 \u0647\u0627 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0639\u062f\u062f\u06cc \u0647\u0633\u062a\u0646\u062f \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f\u060c \u0633\u0644\u0627\u0645\u062a \u0648 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u0646\u062f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0633\u06cc\u0627\u0647\u0647\u0647\u0627<\/strong>: \u06af\u0632\u0627\u0631\u0634\u200c\u0647\u0627 \u0648\u0631\u0648\u062f\u06cc\u200c\u0647\u0627\u06cc \u0645\u062a\u0646\u06cc \u0647\u0633\u062a\u0646\u062f \u06a9\u0647 \u0627\u0644\u06af\u0648\u0647\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0641\u0639\u0627\u0644\u06cc\u062a\u200c\u0647\u0627 \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062a\u0648\u0635\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D9%87_%D8%B3%D9%88%D8%A7%D8%B1_%D9%82%D8%A7%D8%A8%D9%84_%D9%85%D8%B4%D8%A7%D9%87%D8%AF%D9%87\"><\/span>\n<p>  \u0633\u0647 \u0633\u0648\u0627\u0631 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0634\u0627\u0647\u062f\u0647\u200c\u067e\u0630\u06cc\u0631\u06cc \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u0632 \u0628\u06cc\u0631\u0648\u0646 \u062f\u0631\u06a9 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 \u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0628\u062f\u0648\u0646 \u0627\u0637\u0644\u0627\u0639 \u0627\u0632 \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0631\u0648\u0646\u06cc \u0622\u0646 \u0633\u0624\u0627\u0644 \u0628\u067e\u0631\u0633\u06cc\u062f. \u0627\u06cc\u0646 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0645\u0634\u06a9\u0644\u0627\u062a \u062c\u062f\u06cc\u062f \u0631\u0627 \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u062f\u060c \u06cc\u0639\u0646\u06cc <strong>&#8220;\u0646\u0627\u0634\u0646\u0627\u062e\u062a\u0647 \u0647\u0627\u06cc \u0646\u0627\u0634\u0646\u0627\u062e\u062a\u0647&#8221;<\/strong>. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647 \u0633\u0648\u0627\u0644 \u067e\u0627\u0633\u062e \u0645\u06cc \u062f\u0647\u062f <strong>&#8220;\u0686\u0631\u0627 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f\u061f&#8221;<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi9rspjryh6lnlxc8ais.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"482\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm i <span class=\"nt\">-g<\/span> @nestjs\/cli\nnest new tracing-app\n<span class=\"nb\">cd <\/span>tracing-app\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%B5%D8%A8_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7\"><\/span>\n<p>  <strong>\u0646\u0635\u0628 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0645\u0631\u062a\u0628\u0637 Jaeger \u0648 OpenTelemetry \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm <span class=\"nb\">install<\/span> @opentelemetry\/sdk-trace-node @opentelemetry\/resources @opentelemetry\/sdk-trace-base \npnpm <span class=\"nb\">install<\/span> @opentelemetry\/instrumentation @prisma\/instrumentation @opentelemetry\/instrumentation-net @opentelemetry\/instrumentation-http @opentelemetry\/instrumentation-express\npnpm <span class=\"nb\">install<\/span> @opentelemetry\/exporter-trace-otlp-http\npnpm <span class=\"nb\">install<\/span> @opentelemetry\/api @opentelemetry\/semantic-conventions\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Prisma ORM \u0648 SQLite \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm <span class=\"nb\">install<\/span> @prisma\/client sqlite3 class-validator\npnpm <span class=\"nb\">install <\/span>prisma <span class=\"nt\">--save-dev<\/span>\npnpm <span class=\"nb\">install<\/span> <span class=\"nt\">--save<\/span> @nestjs\/swagger\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Prisma \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npx prisma init\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f <code>prisma<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0627 a <code>schema.prisma<\/code> \u0641\u0627\u06cc\u0644<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"n\">datasource<\/span> <span class=\"n\">db<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">provider<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">\"sqlite\"<\/span>\n  <span class=\"n\">url<\/span>      <span class=\"o\">=<\/span> <span class=\"nv\">\"file:.\/dev.db\"<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"n\">generator<\/span> <span class=\"n\">client<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">provider<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">\"prisma-client-js\"<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"n\">model<\/span> <span class=\"k\">User<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">id<\/span>    <span class=\"nb\">Int<\/span>     <span class=\"o\">@<\/span><span class=\"n\">id<\/span> <span class=\"o\">@<\/span><span class=\"k\">default<\/span><span class=\"p\">(<\/span><span class=\"n\">autoincrement<\/span><span class=\"p\">())<\/span>\n  <span class=\"n\">name<\/span>  <span class=\"n\">String<\/span>\n  <span class=\"n\">email<\/span> <span class=\"n\">String<\/span>  <span class=\"o\">@<\/span><span class=\"k\">unique<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Prisma \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npx prisma migrate dev <span class=\"nt\">--name<\/span> init\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06a9\u0644\u0627\u06cc\u0646\u062a Prisma \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npx prisma generate\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%DB%8C%DA%A9_%D9%86%D9%82%D8%B7%D9%87_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C_CRUD_%D8%B1%D8%A7_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u06cc\u06a9 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc CRUD \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 CRUD \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm nest generate resource <span class=\"nb\">users<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f <code>users<\/code> \u0645\u0627\u0698\u0648\u0644 \u0628\u0627 \u06a9\u0646\u062a\u0631\u0644\u0631\u060c \u0633\u0631\u0648\u06cc\u0633 \u0648 DTO.<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>prisma.service.ts<\/code> \u0641\u0627\u06cc\u0644 \u062f\u0631 \u067e\u0648\u0634\u0647 \u067e\u0631\u06cc\u0633\u0645\u0627<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Injectable<\/span><span class=\"p\">,<\/span> <span class=\"nx\">OnModuleInit<\/span><span class=\"p\">,<\/span> <span class=\"nx\">OnModuleDestroy<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PrismaClient<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@prisma\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">Injectable<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">PrismaService<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">PrismaClient<\/span> <span class=\"k\">implements<\/span> <span class=\"nx\">OnModuleInit<\/span><span class=\"p\">,<\/span> <span class=\"nx\">OnModuleDestroy<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">async<\/span> <span class=\"nf\">onModuleInit<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">$connect<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">onModuleDestroy<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">$disconnect<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f <code>users.module.ts<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u06af\u0646\u062c\u0627\u0646\u062f\u0646 <code>PrismaService<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Module<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">UsersService<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/users.service<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">UsersController<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/users.controller<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PrismaService<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/..\/prisma\/prisma.service<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">Module<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">controllers<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">UsersController<\/span><span class=\"p\">],<\/span>\n  <span class=\"na\">providers<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">UsersService<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PrismaService<\/span><span class=\"p\">],<\/span>\n<span class=\"p\">})<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UsersModule<\/span> <span class=\"p\">{<\/span> <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>create-user.dto.ts<\/code> \u062f\u0631 <code>users\/dto<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">IsEmail<\/span><span class=\"p\">,<\/span> <span class=\"nx\">IsNotEmpty<\/span><span class=\"p\">,<\/span> <span class=\"nx\">IsString<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">class-validator<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ApiProperty<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/swagger<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">CreateUserDto<\/span> <span class=\"p\">{<\/span>\n    <span class=\"p\">@<\/span><span class=\"nd\">ApiProperty<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">The name of the user<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">example<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">John Doe<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">})<\/span>\n    <span class=\"p\">@<\/span><span class=\"nd\">IsNotEmpty<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">@<\/span><span class=\"nd\">IsString<\/span><span class=\"p\">()<\/span>\n    <span class=\"nx\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"p\">@<\/span><span class=\"nd\">ApiProperty<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">The email of the user<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">example<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">email@domain.com<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">})<\/span>\n    <span class=\"p\">@<\/span><span class=\"nd\">IsNotEmpty<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">@<\/span><span class=\"nd\">IsEmail<\/span><span class=\"p\">()<\/span>\n    <span class=\"nx\">email<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UpdateUserDto<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">PartialType<\/span><span class=\"p\">(<\/span><span class=\"nx\">CreateUserDto<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f <code>users.service.ts<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Prisma:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Injectable<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PrismaService<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/prisma\/prisma.service<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">CreateUserDto<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/dto\/create-user.dto<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">UpdateUserDto<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/dto\/update-user.dto<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">Injectable<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UsersService<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"k\">private<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PrismaService<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">createUserDto<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CreateUserDto<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">createUserDto<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">findAll<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">findMany<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">findOne<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">findUnique<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">id<\/span> <span class=\"p\">},<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">updateUserDto<\/span><span class=\"p\">:<\/span> <span class=\"nx\">UpdateUserDto<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">update<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">id<\/span> <span class=\"p\">},<\/span>\n      <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">updateUserDto<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">remove<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"k\">delete<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">id<\/span> <span class=\"p\">},<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f<\/strong> <code>users.controller.ts<\/code>  \u0641\u0627\u06cc\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Controller<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Get<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Post<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Body<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Patch<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Param<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Delete<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">UsersService<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/users.service<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">CreateUserDto<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/dto\/create-user.dto<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">UpdateUserDto<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/dto\/update-user.dto<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ApiGoneResponse<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ApiNotFoundResponse<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ApiOkResponse<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ApiOperation<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ApiParam<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ApiTags<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/swagger<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">ApiTags<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">users<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">@<\/span><span class=\"nd\">Controller<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">users<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UsersController<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"nx\">usersService<\/span><span class=\"p\">:<\/span> <span class=\"nx\">UsersService<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOperation<\/span><span class=\"p\">({<\/span> <span class=\"na\">summary<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Create user<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOkResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User created<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">Post<\/span><span class=\"p\">()<\/span>\n  <span class=\"nf\">create<\/span><span class=\"p\">(@<\/span><span class=\"nd\">Body<\/span><span class=\"p\">()<\/span> <span class=\"nx\">createUserDto<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CreateUserDto<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">usersService<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">createUserDto<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOperation<\/span><span class=\"p\">({<\/span> <span class=\"na\">summary<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Get all users<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOkResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Users found<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">Get<\/span><span class=\"p\">()<\/span>\n  <span class=\"nf\">findAll<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">usersService<\/span><span class=\"p\">.<\/span><span class=\"nf\">findAll<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOperation<\/span><span class=\"p\">({<\/span> <span class=\"na\">summary<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Get user by id<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOkResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User found<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiNotFoundResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User not found<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiParam<\/span><span class=\"p\">({<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User id<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">Get<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">:id<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"nf\">findOne<\/span><span class=\"p\">(@<\/span><span class=\"nd\">Param<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">usersService<\/span><span class=\"p\">.<\/span><span class=\"nf\">findOne<\/span><span class=\"p\">(<\/span><span class=\"o\">+<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOperation<\/span><span class=\"p\">({<\/span> <span class=\"na\">summary<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Update user<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOkResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User updated<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiNotFoundResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User not found<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiParam<\/span><span class=\"p\">({<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User id<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">Patch<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">:id<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"nf\">update<\/span><span class=\"p\">(@<\/span><span class=\"nd\">Param<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"p\">@<\/span><span class=\"nd\">Body<\/span><span class=\"p\">()<\/span> <span class=\"nx\">updateUserDto<\/span><span class=\"p\">:<\/span> <span class=\"nx\">UpdateUserDto<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">usersService<\/span><span class=\"p\">.<\/span><span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"o\">+<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">updateUserDto<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiOperation<\/span><span class=\"p\">({<\/span> <span class=\"na\">summary<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Delete user<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiGoneResponse<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User deleted<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">ApiParam<\/span><span class=\"p\">({<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User id<\/span><span class=\"dl\">'<\/span> <span class=\"p\">})<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">Delete<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">:id<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"nf\">remove<\/span><span class=\"p\">(@<\/span><span class=\"nd\">Param<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">usersService<\/span><span class=\"p\">.<\/span><span class=\"nf\">remove<\/span><span class=\"p\">(<\/span><span class=\"o\">+<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%B5%D8%A7%D8%AF%D8%B1%DA%A9%D9%86%D9%86%D8%AF%DA%AF%D8%A7%D9%86\"><\/span>\n<p>  <strong>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0635\u0627\u062f\u0631\u06a9\u0646\u0646\u062f\u06af\u0627\u0646<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <strong><em>\u0631\u062f\u06cc\u0627\u0628\u06cc.ts<\/em><\/strong>  \u062f\u0631 \u0634\u0645\u0627 <strong><em>src<\/em><\/strong>  \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ATTR_SERVICE_NAME<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ATTR_SERVICE_VERSION<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/semantic-conventions<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BatchSpanProcessor<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/sdk-trace-base<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ExpressInstrumentation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/instrumentation-express<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">HttpInstrumentation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/instrumentation-http<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">NetInstrumentation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/instrumentation-net<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">NodeTracerProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/sdk-trace-node<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">OTLPTraceExporter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/exporter-trace-otlp-http<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PrismaInstrumentation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@prisma\/instrumentation<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Resource<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/resources<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">diag<\/span><span class=\"p\">,<\/span> <span class=\"nx\">DiagConsoleLogger<\/span><span class=\"p\">,<\/span> <span class=\"nx\">DiagLogLevel<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/api<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">registerInstrumentations<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@opentelemetry\/instrumentation<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">setupTracing<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Enable OpenTelemetry diagnostic logging<\/span>\n    <span class=\"nx\">diag<\/span><span class=\"p\">.<\/span><span class=\"nf\">setLogger<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">DiagConsoleLogger<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">DiagLogLevel<\/span><span class=\"p\">.<\/span><span class=\"nx\">INFO<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Create a resource with service information<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">resource<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Resource<\/span><span class=\"p\">({<\/span>\n        <span class=\"p\">[<\/span><span class=\"nx\">ATTR_SERVICE_NAME<\/span><span class=\"p\">]:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">SERVICE_NAME<\/span> <span class=\"o\">||<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">tracer-app<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">[<\/span><span class=\"nx\">ATTR_SERVICE_VERSION<\/span><span class=\"p\">]:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">npm_package_version<\/span> <span class=\"o\">||<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">1.0.0<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">otlpExporter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">OTLPTraceExporter<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">OTEL_EXPORTER_OTLP_ENDPOINT<\/span> <span class=\"o\">||<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">http:\/\/localhost:4318\/v1\/traces<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">});<\/span>\n\n\n    <span class=\"c1\">\/\/ Create tracer provider with resource and span processors<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">provider<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">NodeTracerProvider<\/span><span class=\"p\">({<\/span>\n        <span class=\"nx\">resource<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">spanProcessors<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n            <span class=\"k\">new<\/span> <span class=\"nc\">BatchSpanProcessor<\/span><span class=\"p\">(<\/span><span class=\"nx\">otlpExporter<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n                <span class=\"na\">maxQueueSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">100<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">scheduledDelayMillis<\/span><span class=\"p\">:<\/span> <span class=\"mi\">5000<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">exportTimeoutMillis<\/span><span class=\"p\">:<\/span> <span class=\"mi\">30000<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">maxExportBatchSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">50<\/span><span class=\"p\">,<\/span>\n            <span class=\"p\">})<\/span>\n        <span class=\"p\">]<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ Register instrumentations with more comprehensive coverage<\/span>\n    <span class=\"nf\">registerInstrumentations<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">tracerProvider<\/span><span class=\"p\">:<\/span> <span class=\"nx\">provider<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">instrumentations<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n            <span class=\"k\">new<\/span> <span class=\"nc\">HttpInstrumentation<\/span><span class=\"p\">({<\/span>\n                <span class=\"na\">requestHook<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">span<\/span><span class=\"p\">,<\/span> <span class=\"nx\">request<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"nx\">span<\/span><span class=\"p\">.<\/span><span class=\"nf\">setAttribute<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">http.request.method<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">request<\/span><span class=\"p\">.<\/span><span class=\"nx\">method<\/span><span class=\"p\">);<\/span>\n                <span class=\"p\">},<\/span>\n            <span class=\"p\">}),<\/span>\n            <span class=\"k\">new<\/span> <span class=\"nc\">NetInstrumentation<\/span><span class=\"p\">(),<\/span>\n            <span class=\"k\">new<\/span> <span class=\"nc\">ExpressInstrumentation<\/span><span class=\"p\">(),<\/span>\n            <span class=\"k\">new<\/span> <span class=\"nc\">PrismaInstrumentation<\/span><span class=\"p\">({<\/span> <span class=\"na\">middleware<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">}),<\/span>\n        <span class=\"p\">],<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ Register the provider<\/span>\n    <span class=\"nx\">provider<\/span><span class=\"p\">.<\/span><span class=\"nf\">register<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"c1\">\/\/ Return the provider for potential manual instrumentation<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">provider<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Call this at application startup<\/span>\n<span class=\"nf\">setupTracing<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D9%88%D8%B6%DB%8C%D8%AD\"><\/span>\n<p>  <strong>\u062a\u0648\u0636\u06cc\u062d<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\n<p><strong>\u062b\u0628\u062a \u062a\u0634\u062e\u06cc\u0635\u06cc:<\/strong> \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062a\u0634\u062e\u06cc\u0635\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062b\u0628\u062a\u200c\u06a9\u0646\u0646\u062f\u0647 \u06a9\u0646\u0633\u0648\u0644 \u062f\u0631 \u0642\u0633\u0645\u062a \u0641\u0639\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f <code>INFO<\/code> \u0633\u0637\u062d \u0628\u0631\u0627\u06cc \u0631\u0641\u0639 \u0627\u0634\u06a9\u0627\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0631\u062f\u06cc\u0627\u0628\u06cc.<\/p>\n<\/li>\n<li>\n<p><strong>\u0627\u0648\u0644\u06cc\u0647 \u0633\u0627\u0632\u06cc \u0645\u0646\u0627\u0628\u0639:<\/strong><\/p>\n<ul>\n<li>\u0645\u062a\u0627\u062f\u06cc\u062a\u0627 \u0631\u0627 \u062f\u0631\u0628\u0627\u0631\u0647 \u0633\u0631\u0648\u06cc\u0633 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0645\u0627\u0646\u0646\u062f <code>SERVICE_NAME<\/code> \u0648 <code>SERVICE_VERSION<\/code>.<\/li>\n<li>\u0627\u06cc\u0646 \u0627\u0628\u0631\u062f\u0627\u062f\u0647 \u0628\u0647 \u0647\u0631 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0628\u0647 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u062e\u062f\u0645\u0627\u062a\u06cc \u06a9\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u062a\u0639\u0644\u0642 \u0627\u0633\u062a \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0635\u0627\u062f\u0631\u06a9\u0646\u0646\u062f\u0647 \u0631\u062f\u06cc\u0627\u0628\u06cc OTLP:<\/strong> \u067e\u0631\u0648\u062a\u06a9\u0644 OpenTelemetry \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f (<strong>OTLP<\/strong>) \u0635\u0627\u062f\u0631 \u06a9\u0646\u0646\u062f\u0647 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0628\u0647 \u0628\u0627\u0637\u0646 \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 Jaeger \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f <strong><em>HTTP<\/em><\/strong>  \u067e\u0631\u0648\u062a\u06a9\u0644 \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 Jaeger \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0627 \u0628\u0627\u0637\u0646 \u062f\u06cc\u06af\u0631\u06cc \u0645\u0627\u0646\u0646\u062f Honeycomb\u060c Zipkin \u0648 \u063a\u06cc\u0631\u0647 \u062a\u0639\u0648\u06cc\u0636 \u06a9\u0631\u062f \u0648 \u0634\u0645\u0627 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0631\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0622\u0645\u062f\u062a\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f. <strong>GRPC<\/strong> \u0627\u0632 \u062c\u0627\u0631\u06cc <strong>HTTP.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 Tracer \u0628\u0627 \u067e\u0631\u062f\u0627\u0632\u0646\u062f\u0647 Span:<\/strong> a \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f <code>NodeTracerProvider<\/code>\u060c \u06a9\u0647 \u0631\u062f\u06cc\u0627\u0628 \u0647\u0627 \u0648 \u06af\u0633\u062a\u0631\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<\/li>\n<li>\n<p><strong>\u062b\u0628\u062a \u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642<\/strong>: \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0631\u062f\u06cc\u0627\u0628\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627 \u0648 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627 \u0631\u0627 \u0645\u06cc \u06af\u06cc\u0631\u062f:<\/p>\n<ul>\n<li>\n<code>HttpInstrumentation<\/code>: \u0632\u0645\u0627\u0646 \u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\/\u067e\u0627\u0633\u062e \u0647\u0627\u06cc HTTP \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>NetInstrumentation<\/code>: \u0632\u0645\u0627\u0646 \u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0633\u0637\u062d \u067e\u0627\u06cc\u06cc\u0646 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>ExpressInstrumentation<\/code>: \u0632\u0645\u0627\u0646 \u0645\u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 Express \u0648 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<code>PrismaInstrumentation<\/code>: \u0632\u0645\u0627\u0646 \u0635\u0631\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u067e\u0631\u0633\u0634 \u0647\u0627\u06cc SQL \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 Prisma \u0631\u0627 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%DA%A9%D8%AF_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1_%D8%AF%D9%82%DB%8C%D9%82_%D8%B1%D8%A7_%D8%AF%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D9%88%D8%A7%D8%B1%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u06a9\u062f \u0627\u0628\u0632\u0627\u0631 \u062f\u0642\u06cc\u0642 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0648 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0627\u0648\u0644\u06cc\u0647 \u06a9\u0646\u06cc\u062f <strong><em>main.ts<\/em><\/strong>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">NestFactory<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/core<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SwaggerModule<\/span><span class=\"p\">,<\/span> <span class=\"nx\">DocumentBuilder<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/swagger<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">AppModule<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/app.module<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/tracing<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">bootstrap<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">app<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">NestFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">AppModule<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">config<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">DocumentBuilder<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">setTitle<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Tracing example<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">setDescription<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">The tracing API description<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">setVersion<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">1.0<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">addTag<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">tracing<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">build<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">documentFactory<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">SwaggerModule<\/span><span class=\"p\">.<\/span><span class=\"nf\">createDocument<\/span><span class=\"p\">(<\/span><span class=\"nx\">app<\/span><span class=\"p\">,<\/span> <span class=\"nx\">config<\/span><span class=\"p\">);<\/span>\n  <span class=\"nx\">SwaggerModule<\/span><span class=\"p\">.<\/span><span class=\"nf\">setup<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">api-docs<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">app<\/span><span class=\"p\">,<\/span> <span class=\"nx\">documentFactory<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"k\">await<\/span> <span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/span><span class=\"p\">(<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span> <span class=\"o\">??<\/span> <span class=\"mi\">3000<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"nf\">bootstrap<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"nx\">pnpm<\/span> <span class=\"nx\">run<\/span> <span class=\"nx\">start<\/span><span class=\"p\">:<\/span><span class=\"nx\">dev<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D9%86%D8%B8%DB%8C%D9%85_Jaeger_%D8%A8%D8%B1%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7_%D8%AA%D9%88%D8%B3%D8%B9%D9%87\"><\/span>\n<p>  <strong>\u062a\u0646\u0638\u06cc\u0645 Jaeger \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0633\u0627\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0631\u0627\u0647 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Jaeger \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0648\u06cc\u0646\u0686 docker-compose \u062f\u0631 \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647 \u0628\u0647 \u062e\u0648\u0628\u06cc \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>docker-compose.yaml<\/code> \u0641\u0627\u06cc\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">jaeger<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jaegertracing\/all-in-one:1.63.0<\/span>\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jaeger<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">COLLECTOR_OTLP_ENABLED<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">true\"<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">4317:4317\"<\/span> <span class=\"c1\"># For Jaeger-GRPC<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">4318:4318\"<\/span> <span class=\"c1\"># For Jaeger-HTTP<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">16686:16686\"<\/span> <span class=\"c1\"># # Web UI<\/span>\n\n<span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">default<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">bridge<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Containerize_%D8%A7%D8%AE%D8%AA%DB%8C%D8%A7%D8%B1%DB%8C\"><\/span>\n<p>  <strong>\u0628\u0631\u0646\u0627\u0645\u0647 Containerize (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc)<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <strong>docker init<\/strong> \u0627\u06af\u0631 \u0646\u0633\u062e\u0647 \u062c\u062f\u06cc\u062f\u062a\u0631 Docker \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u062f\u0633\u062a\u0648\u0631 \u062a\u0648\u0644\u06cc\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u06cc\u06a9 Dockerfile \u0628\u0647\u06cc\u0646\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0635\u0627\u062f\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight docker\"><code><span class=\"c\"># Arguments for versions<\/span>\n<span class=\"k\">ARG<\/span><span class=\"s\"> NODE_VERSION=20.18.0<\/span>\n<span class=\"k\">ARG<\/span><span class=\"s\"> PNPM_VERSION=9.12.2<\/span>\n<span class=\"k\">ARG<\/span><span class=\"s\"> ALPINE_VERSION=3.20<\/span>\n\n<span class=\"c\">################################################################################<\/span>\n<span class=\"c\"># Base stage: Build the application<\/span>\n<span class=\"k\">FROM<\/span><span class=\"w\"> <\/span><span class=\"s\">node:${NODE_VERSION}-alpine${ALPINE_VERSION}<\/span><span class=\"w\"> <\/span><span class=\"k\">AS<\/span><span class=\"w\"> <\/span><span class=\"s\">builder<\/span>\n\n<span class=\"c\"># Set working directory<\/span>\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/usr\/src\/app<\/span>\n\n<span class=\"c\"># Install pnpm globally with cache<\/span>\n<span class=\"k\">RUN <\/span><span class=\"nt\">--mount<\/span><span class=\"o\">=<\/span><span class=\"nb\">type<\/span><span class=\"o\">=<\/span>cache,target<span class=\"o\">=<\/span>\/root\/.npm <span class=\"se\">\\\n<\/span>    npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> pnpm@<span class=\"k\">${<\/span><span class=\"nv\">PNPM_VERSION<\/span><span class=\"k\">}<\/span>\n\n<span class=\"c\"># Copy package.json and pnpm-lock.yaml to install dependencies<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> ..\/package.json pnpm-lock.yaml .\/<\/span>\n\n<span class=\"c\"># Install dependencies with cache<\/span>\n<span class=\"k\">RUN <\/span><span class=\"nt\">--mount<\/span><span class=\"o\">=<\/span><span class=\"nb\">type<\/span><span class=\"o\">=<\/span>cache,target<span class=\"o\">=<\/span>\/root\/.pnpm-store <span class=\"se\">\\\n<\/span>    pnpm <span class=\"nb\">install<\/span> <span class=\"nt\">--frozen-lockfile<\/span>\n\n<span class=\"c\"># Copy the all application code<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> .. .<\/span>\n\n<span class=\"c\"># Setup prisma<\/span>\n<span class=\"k\">RUN <\/span>pnpm prisma generate\n\n<span class=\"c\"># Build the application<\/span>\n<span class=\"k\">RUN <\/span>pnpm run build\n\n<span class=\"c\"># Runner Stage<\/span>\n<span class=\"k\">FROM<\/span><span class=\"w\"> <\/span><span class=\"s\">node:${NODE_VERSION}-alpine${ALPINE_VERSION}<\/span><span class=\"w\"> <\/span><span class=\"k\">AS<\/span><span class=\"w\"> <\/span><span class=\"s\">runner<\/span>\n\n<span class=\"c\"># Set working directory<\/span>\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/usr\/src\/app<\/span>\n\n<span class=\"c\"># Copy the built application from the builder stage<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=builder \/usr\/src\/app\/dist .\/dist<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> ..\/package.json pnpm-lock.yaml .\/<\/span>\n<span class=\"k\">COPY<\/span><span class=\"s\"> ..\/prisma\/schema.prisma .\/prisma\/schema.prisma<\/span>\n\n<span class=\"c\"># Install pnpm globally<\/span>\n<span class=\"k\">RUN <\/span><span class=\"nt\">--mount<\/span><span class=\"o\">=<\/span><span class=\"nb\">type<\/span><span class=\"o\">=<\/span>cache,target<span class=\"o\">=<\/span>\/root\/.npm <span class=\"se\">\\\n<\/span>    npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> pnpm@<span class=\"k\">${<\/span><span class=\"nv\">PNPM_VERSION<\/span><span class=\"k\">}<\/span>\n\n<span class=\"c\"># Install dependencies with cache<\/span>\n<span class=\"k\">RUN <\/span><span class=\"nt\">--mount<\/span><span class=\"o\">=<\/span><span class=\"nb\">type<\/span><span class=\"o\">=<\/span>cache,target<span class=\"o\">=<\/span>\/root\/.pnpm-store <span class=\"se\">\\\n<\/span>    pnpm <span class=\"nb\">install<\/span> <span class=\"nt\">--frozen-lockfile<\/span> <span class=\"nt\">--prod<\/span>\n\n<span class=\"c\"># Set NODE_ENV to production<\/span>\n<span class=\"k\">ENV<\/span><span class=\"s\"> NODE_ENV=production<\/span>\n\n<span class=\"c\"># Run the application<\/span>\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"pnpm\", \"run\", \"start:prod\"]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Swagger_UI\"><\/span>\n<p>  <strong>Swagger UI<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0632 http:\/\/localhost:3000\/api-docs \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f \u0648 \u0686\u0646\u062f \u062a\u0645\u0627\u0633 API \u0628\u0631\u0642\u0631\u0627\u0631 \u06a9\u0646\u06cc\u062f<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykhlbqpqu10jbx6fdfwg.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"757\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D8%AC%D8%B3%D9%85_%D8%A2%D8%AB%D8%A7%D8%B1\"><\/span>\n<p>  <strong>\u062a\u062c\u0633\u0645 \u0622\u062b\u0627\u0631<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 <code>http:\/\/localhost:16686<\/code> \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc Jaeger. \u0686\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <strong>\u0631\u062f\u06cc\u0627\u0628\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f<\/strong> \u0648 \u0631\u0648\u06cc \u06cc\u06a9 Trace \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcvnvruxrzbjg3smwdrh.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"262\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18dtdsu6dectmnvy73hk.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"141\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjezcn66r051yas4il448.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"222\" title=\"\"><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u0642\u062f\u0645\u0647 \u0622\u06cc\u0627 \u062a\u0627 \u0628\u0647 \u062d\u0627\u0644 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u067e\u06cc\u0634 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0634\u06a9\u0627\u0644\u06cc \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f \u0631\u062e \u062f\u0627\u062f\u0647 \u0628\u0627\u0634\u062f \u0648 \u0647\u06cc\u0686 \u0627\u06cc\u062f\u0647 \u0627\u06cc \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0686\u0647 \u0645\u0634\u06a9\u0644\u06cc \u0631\u062e \u062f\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u0632\u06cc\u0631\u0627 \u06af\u0632\u0627\u0631\u0634 \u0647\u0627\u06cc \u0634\u0645\u0627 \u062f\u0642\u06cc\u0642\u0627\u064b \u0628\u0647 \u0634\u0645\u0627 \u0646\u0645\u06cc \u06af\u0648\u06cc\u062f \u06a9\u0647 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u0631\u062e \u062f\u0627\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":86393,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-86392","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=86392"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86392\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/86393"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=86392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=86392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=86392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}