Rumah > hujung hadapan web > tutorial js > Menganalisis Aliran Panggilan API dengan Prisma dan Next.js: Pengumpulan mengikut Minggu, Bulan atau Tahun

Menganalisis Aliran Panggilan API dengan Prisma dan Next.js: Pengumpulan mengikut Minggu, Bulan atau Tahun

Susan Sarandon
Lepaskan: 2025-01-20 02:33:10
asal
934 orang telah melayarinya

Analyzing API Call Trends with Prisma and Next.js: Grouping by Week, Month, or Year

Catatan blog ini menyediakan penyelesaian praktikal untuk mengumpulkan data mengikut hari, bulan atau tahun menggunakan Prisma. Saya sendiri bergelut dengan perkara ini, jadi saya berkongsi pendekatan yang diperkemas ini. Kami akan menggunakan titik akhir API Next.js untuk menganalisis aliran panggilan API menggunakan Prisma dan MongoDB, memfokuskan pada kadar kejayaan dan kekerapan panggilan dari semasa ke semasa.

Struktur Data Panggilan API Dipermudahkan

Papan pemuka yang berkesan memerlukan pengumpulan panggilan API mengikut selang masa. Jom gunakan skema Prisma yang ringkas:

<code>model ApiCall {
  id        String    @id @default(auto()) @map("_id") @db.ObjectId
  timestamp DateTime  @default(now())
  status    ApiCallStatus // Enum for success or failure.
}

enum ApiCallStatus {
  SUCCESS
  FAILURE
}</code>
Salin selepas log masuk

Skema ini menjejaki cap masa dan status setiap panggilan API, mencukupi untuk analisis arah aliran.

Menyiasat Aliran Panggilan API: Titik Akhir API Next.js

Titik akhir API Next.js ini mengagregatkan data panggilan API, mengumpulkannya mengikut tempoh masa tertentu (tahun, bulan atau hari):

<code>import { NextRequest, NextResponse } from 'next/server';
import { startOfYear, endOfYear, startOfMonth, endOfMonth } from 'date-fns';

export async function GET(req: NextRequest) {
    const range = req.nextUrl.searchParams.get("range"); // 'year' or 'month'
    const groupBy = req.nextUrl.searchParams.get("groupby"); // 'yearly', 'monthly', 'daily'

    // Input validation
    if (!range || (range !== 'year' && range !== 'month')) {
        return NextResponse.json({ error: "Range must be 'year' or 'month'" }, { status: 400 });
    }

    if (!groupBy || (groupBy !== 'yearly' && groupBy !== 'monthly' && groupBy !== 'daily')) {
        return NextResponse.json({ error: "Group by must be 'yearly', 'monthly', or 'daily'" }, { status: 400 });
    }

    try {
        let start: Date, end: Date;
        if (range === 'year') {
            start = startOfYear(new Date());
            end = endOfYear(new Date());
        } else { // range === 'month'
            start = startOfMonth(new Date());
            end = endOfMonth(new Date());
        }

        let groupByFormat: string;
        switch (groupBy) {
            case 'yearly':
                groupByFormat = "%Y";
                break;
            case 'monthly':
                groupByFormat = "%Y-%m";
                break;
            case 'daily':
                groupByFormat = "%Y-%m-%d";
                break;
        }

        const apiCallTrends = await db.apiCall.aggregateRaw({
            pipeline: [
                {
                    $match: {
                        timestamp: { $gte: { $date: start }, $lte: { $date: end } }
                    }
                },
                {
                    $group: {
                        _id: { $dateToString: { format: groupByFormat, date: '$timestamp' } },
                        SUCCESS: { $sum: { $cond: [{ $eq: ['$status', 'SUCCESS'] }, 1, 0] } },
                        FAILURE: { $sum: { $cond: [{ $eq: ['$status', 'FAILURE'] }, 1, 0] } },
                        TOTAL: { $sum: 1 }
                    }
                },
                {
                    $sort: {
                        _id: 1
                    }
                }
            ]
        });

        return NextResponse.json({ apiCallTrends });
    } catch (error) {
        console.error(error);
        return NextResponse.json({ error: "An error occurred while fetching data." }, { status: 500 });
    }
}</code>
Salin selepas log masuk

Sampel Respons

Permintaan seperti ini:

<code>GET /api/your-endpoint?range=year&groupby=monthly</code>
Salin selepas log masuk

Mungkin menghasilkan respons ini:

<code>{
  "apiCallTrends": [
    {
      "_id": "2025-01", // January 2025
      "SUCCESS": 120,
      "FAILURE": 15,
      "TOTAL": 135
    },
    {
      "_id": "2025-02", // February 2025
      "SUCCESS": 110,
      "FAILURE": 10,
      "TOTAL": 120
    },
    {
      "_id": "2025-03", // March 2025
      "SUCCESS": 130,
      "FAILURE": 20,
      "TOTAL": 150
    }
    // ... more monthly data
  ]
}</code>
Salin selepas log masuk

Ciri Utama

  • Pengumpulan Masa Fleksibel: Kumpulkan dengan mudah mengikut tahun, bulan atau hari.
  • Analisis Trend Komprehensif: Menyediakan kiraan kejayaan/gagal dan jumlah untuk setiap tempoh.
  • Pengendalian Ralat Teguh: Termasuk respons ralat yang jelas.
  • Prestasi Dioptimumkan: Memanfaatkan saluran pengagregatan MongoDB untuk kecekapan.

Kesimpulan

Pendekatan ini menyediakan kaedah yang mantap dan cekap untuk menyoal dan menganalisis data bercap masa yang dikumpulkan mengikut pelbagai julat masa dalam MongoDB, menggunakan Prisma ORM. Terima kasih kerana membaca! Sila like dan subscribe untuk lebih banyak kandungan! Berhubung dengan saya di GitHub dan LinkedIn.

Atas ialah kandungan terperinci Menganalisis Aliran Panggilan API dengan Prisma dan Next.js: Pengumpulan mengikut Minggu, Bulan atau Tahun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan