Bỏ qua để đến nội dung
getnextpdf.com

Enterprise phiên bản

Metering — Tài liệu tham chiếu chuyên sâu

Namespace NextPDF\Enterprise\Metering cung cấp việc đo lường sử dụng ở mức điều phối phục vụ khả năng quan sát tính phí và kiểm toán. Bề mặt công khai gồm sáu ký hiệu: MeterCollector, MeterEntry, MeteringReporter, MeteringBackendInterface, PrometheusMeteringBackend, và PrometheusPushgatewayException. Collector đệm các entry bất biến trong bộ nhớ và flush chúng theo từng batch. Reporter phân phối mỗi batch tới một hoặc nhiều backend với thử lại theo từng backend và cô lập lỗi. Metering là best-effort và không gây tử vong: một sự cố backend metering làm suy giảm khả năng quan sát, không bao giờ làm suy giảm việc xử lý tài liệu. Luồng này không phải là nguồn có thẩm quyền cho việc thực thi quota. Để xem hướng dẫn ở mức quy trình, hãy xem Metering.

Khả năng này đi kèm trong NextPDF Enterprise (nextpdf/enterprise) và được kích hoạt bằng một license envelope bậc Enterprise. Một triển khai không có quyền đó sẽ không nạp các lớp của khả năng này. So sánh các phiên bản và lấy giấy phép.

Metering là một khả năng nền tảng của Enterprise, khả dụng một khi gói Enterprise được cài đặt; không có cờ riêng theo từng tính năng. NextPDF Core (Apache-2.0) và NextPDF Pro không có bề mặt collector, reporter, hay backend nào; hợp đồng chỉ đi kèm trong nextpdf/enterprise.

Ký hiệuTham sốHành vi mặc địnhTrả vềNém hoặc thất bại vớiGhi chú
MeterCollector::__constructMeteringReporter $reporter, int $bufferSize = 100Tạo một collector với buffer rỗng trong bộ nhớMeterCollector mớiKhông ném$bufferSize được tài liệu hóa là positive-int
MeterCollector::recordstring $operation, int $count, string $tenantId, string $licenseId, int $pagesProcessed = 0, float $durationMs = 0.0, array $metadata = []Nối thêm một MeterEntry bất biến được đóng dấu thời gian hiện tại; tự động flush khi buffer đạt $bufferSizevoidKhông ném; một auto-flush ủy thác cho reporter, vốn không bao giờ némTimestamp được lấy tại thời điểm ghi
MeterCollector::flushTrao tất cả các entry đã đệm cho reporter; buffer rỗng là một no-opvoidKhông ném; các lỗi backend được reporter hấp thụBuffer được hoán đổi ra trước khi trao đi; an toàn khi tái nhập
MeterCollector::bufferCountTrả về số lượng entry đã đệmint<0, max>Không némChẩn đoán và quyết định back-pressure
MeterCollector::registerShutdownFlushĐăng ký flush() qua register_shutdown_functionvoidKhông némGọi một lần tại bootstrap trong các triển khai PHP-FPM
MeterEntry::__constructstring $operation, int $count, DateTimeImmutable $timestamp, string $tenantId, string $licenseId, int $pagesProcessed = 0, float $durationMs = 0.0, array $metadata = []Lưu các giá trị được cung cấp nguyên vănMeterEntry mớiKhông khai báo @throws; PHP phát sinh TypeError khi kiểu đối số không khớp dưới strict_typesfinal readonly; cả tám thuộc tính được promote đều public
MeteringReporter::__constructlist<MeteringBackendInterface> $backends, int $maxRetries = 2, LoggerInterface $logger = new NullLogger()Kiểm tra và lưu danh sách backendMeteringReporter mớiInvalidArgumentException khi $backends rỗng$maxRetries đếm tổng số lần thử giao theo từng backend
MeteringReporter::reportlist<MeterEntry> $entriesGiao batch tới mọi backend một cách độc lập, với thử lại theo từng backendvoidKhông ném; khi cạn số lần thử thì ghi log ở mức error và bỏ batch của backend đóDanh sách rỗng là một no-op
MeteringBackendInterface::reportlist<MeterEntry> $entriesGiao một batch tới backendvoidRuntimeException khi không thể tiếp cận backendCác hiện thực PHẢI là idempotent (khử trùng lặp theo timestamp + operation + tenantId)
MeteringBackendInterface::isHealthyThăm dò khả năng tiếp cậnboolKhông khai báo @throwsChỉ để chẩn đoán; reporter không dựa vào nó
MeteringBackendInterface::backendNameTên backend để chẩn đoánnon-empty-stringKhông khai báo @throwsVí dụ "prometheus", "billing-api", "null"
PrometheusMeteringBackend::__constructClientInterface $httpClient, RequestFactoryInterface $requestFactory, StreamFactoryInterface $streamFactory, string $pushgatewayUrl, string $jobName = 'nextpdf_metering'Cấu hình một push target PushgatewayPrometheusMeteringBackend mớiKhông némClient PSR-18 và các factory PSR-17 được inject
PrometheusMeteringBackend::reportlist<MeterEntry> $entriesTổng hợp batch theo chuỗi operation-và-tenant và POST văn bản exposition tới <pushgatewayUrl>/metrics/job/<jobName>voidPrometheusPushgatewayException khi trạng thái không phải 2xx hoặc khi lỗi vận chuyển PSR-18Danh sách rỗng là một no-op
PrometheusMeteringBackend::isHealthyThăm dò health endpoint của Pushgateway; true chỉ khi HTTP 200boolKhông ném; bất kỳ thất bại nào cũng trả về falseThăm dò GET chỉ đọc
PrometheusMeteringBackend::backendNameTrả về "prometheus"non-empty-stringKhông némHằng số
PrometheusPushgatewayExceptionBáo hiệu một lần giao Pushgateway thất bạiLà throwablefinal; kế thừa RuntimeException
public function __construct(
private readonly MeteringReporter $reporter,
private readonly int $bufferSize = 100,
) {}
public function record(
string $operation,
int $count,
string $tenantId,
string $licenseId,
int $pagesProcessed = 0,
float $durationMs = 0.0,
array $metadata = [],
): void
public function flush(): void
public function bufferCount(): int
public function registerShutdownFlush(): void
public function __construct(
public string $operation,
public int $count,
public DateTimeImmutable $timestamp,
public string $tenantId,
public string $licenseId,
public int $pagesProcessed = 0,
public float $durationMs = 0.0,
public array $metadata = [],
) {}
public function report(array $entries): void;
public function isHealthy(): bool;
public function backendName(): string;
public function __construct(
array $backends,
private readonly int $maxRetries = 2,
private readonly LoggerInterface $logger = new NullLogger(),
)
public function report(array $entries): void
public function __construct(
private readonly ClientInterface $httpClient,
private readonly RequestFactoryInterface $requestFactory,
private readonly StreamFactoryInterface $streamFactory,
private readonly string $pushgatewayUrl,
private readonly string $jobName = self::DEFAULT_JOB_NAME,
) {}
final class PrometheusPushgatewayException extends RuntimeException {}

Các thuộc tính public readonly của MeterEntry

Thuộc tínhKiểuÝ nghĩa
$operationnon-empty-stringLoại thao tác, ví dụ "parse", "compress", "embed", "rag_query"
$countpositive-intSố đơn vị đã tiêu thụ
$timestampDateTimeImmutableThời điểm thao tác diễn ra; collector đóng dấu tại thời điểm ghi
$tenantIdnon-empty-stringĐịnh danh tenant
$licenseIdnon-empty-stringĐịnh danh giấy phép
$pagesProcessedint<0, max>Số trang PDF đã xử lý; 0 cho các thao tác không phải PDF
$durationMsfloatThời lượng thao tác tính bằng mili-giây
$metadataarray<string, mixed>Metadata tự do định dạng đặc thù cho thao tác
  • MeterCollector::record() khởi tạo một MeterEntry bất biến, đóng dấu thời gian hiện tại, và nối thêm vào buffer trong bộ nhớ. Khi buffer đạt $bufferSize entry, collector tự động flush.
  • flush() là idempotent và an toàn khi tái nhập. Một buffer rỗng là một no-op. Buffer được hoán đổi ra trước khi batch được trao cho reporter, nên một flush tái nhập không thể gửi đôi.
  • MeteringReporter từ chối khởi tạo với một danh sách backend rỗng. InvalidArgumentException đó là exception duy nhất trên đường collector/reporter.
  • MeteringReporter::report() giao mỗi batch tới mọi backend một cách độc lập. Một backend thất bại không bao giờ ngăn một backend khác nhận cùng batch đó.
  • $maxRetries đếm tổng số lần thử giao theo từng backend; mặc định 2 nghĩa là một lần thử ban đầu cộng một lần thử lại. Mỗi lần thử thất bại ghi một warning kèm tên backend, số thứ tự lần thử, và số lượng entry.
  • Khi lần thử cuối cùng cho một backend thất bại, reporter ghi log thêm ở mức error kèm số entry bị bỏ, rồi chuyển tiếp. Nó không bao giờ ném từ report(), nên bên gọi không được suy ra việc giao thành công từ một lần trả về bình thường.
  • Các backend PHẢI là idempotent. Hợp đồng interface yêu cầu khử trùng lặp theo khóa timestamp, operation, và định danh tenant. Bản thân reporter không khử trùng lặp.
  • PrometheusMeteringBackend::report() tổng hợp batch thành các chuỗi theo từng operation, từng tenant và POST văn bản exposition Prometheus tới <pushgatewayUrl>/metrics/job/<jobName> với Content-Type text/plain; version=0.0.4. Tên job mặc định là nextpdf_metering.
  • Payload được đẩy mang ba counter — nextpdf_operations_total, nextpdf_pages_processed_total, và nextpdf_operation_duration_ms_total — mỗi cái được gắn nhãn theo operation và tenant.
  • Luồng metering này không có thẩm quyền. Việc thực thi quota và metering tính toán có thẩm quyền tiêu thụ con số sử dụng có thẩm quyền riêng của triển khai, không bao giờ tiêu thụ buffer này. Một khoảng trống trong metering điều phối là một khoảng trống về khả năng quan sát, không phải một khoảng trống về tính đúng đắn của việc tính phí.
  • Batch bị trùng hoặc bị phát lại. Được idempotency của backend hấp thụ; reporter không khử trùng lặp. Đừng dựa vào việc giao đúng một lần.
  • Cạn số lần thử lại. Batch của backend đó bị bỏ và được ghi log ở mức error. Một lần trả về bình thường từ report() hoặc flush() không bao giờ hàm ý việc giao thành công.
  • Tiến trình thoát trước khi flush. Buffer chỉ nằm trong bộ nhớ. Một sự cố sập, hoặc một lần thoát mà không có shutdown handler đã đăng ký, sẽ mất các entry đã đệm.
  • Không khớp mô hình worker. Các triển khai PHP-FPM gọi registerShutdownFlush() một lần tại bootstrap để phần còn lại flush khi kết thúc request. Các worker chạy lâu dài (Octane, Symfony worker, queue worker) phải flush trên một timer định kỳ thay vào đó; nếu không các entry sẽ tích lũy cho tới khi tiến trình worker thoát.
  • $bufferSize dưới 1. Vi phạm hợp đồng positive-int đã tài liệu hóa; kết quả quan sát được là một flush trên mỗi lần gọi record().
  • Metadata nhạy cảm. $metadata là tự do định dạng và có thể mang theo bối cảnh thao tác nhạy cảm. Việc lưu trữ, lưu giữ, và kiểm soát truy cập là trách nhiệm của người vận hành backend.
  • Lỗi giao Pushgateway. Một phản hồi không phải 2xx phát sinh PrometheusPushgatewayException mang theo trạng thái HTTP và thân phản hồi; một lỗi vận chuyển PSR-18 được bọc trong cùng loại exception đó. Vòng lặp thử-lại-và-cô-lập của reporter hấp thụ cả hai.
  • Health probe. PrometheusMeteringBackend::isHealthy() phát một GET tới <pushgatewayUrl>/-/healthy và chỉ trả về true khi HTTP 200. Bất kỳ lỗi vận chuyển nào cũng trả về false; probe không bao giờ ném.
  • Giá trị nhãn thù địch. Các ký tự backslash, dấu nháy kép, và line-feed trong giá trị operation hoặc tenant được escape khi phát ra, nên một giá trị nhãn không thể tiêm thêm dòng exposition hoặc làm hỏng khối nhãn.
  • Chế độ FIPS. Collector và reporter không thực hiện thao tác mật mã nào và không có hành vi đặc thù theo FIPS. Một backend ký hoặc mã hóa trong khi truyền sẽ kế thừa tư thế FIPS của host crypto provider của nó.

Không có tiêu chuẩn bên ngoài nào quản lý hợp đồng collector, reporter, hay backend trong tiến trình; không có đặc tả quy phạm nào để dẫn chiếu, nên trang này không mang dẫn chiếu RAG nào theo thiết kế. Backend Prometheus phát ra định dạng Prometheus text exposition và đẩy với Content-Type text/plain; version=0.0.4; định dạng đó là một quy ước hệ sinh thái chứ không phải một tiêu chuẩn ISO hay IETF, và tuyên bố này được đặt nền trên mã nguồn sản phẩm. NextPDF không đưa ra tuyên bố về phù hợp hay chứng nhận nào cho bề mặt này.

  • Tất cả các lớp khai báo strict_types=1 và là final; MeterEntryfinal readonly với các thuộc tính public được promote. Kiểu đối số không khớp phát sinh một TypeError PHP ở bên gọi.
  • Các lớp của module mang chú thích gói @since2.1.0; PrometheusPushgatewayException mang @since 3.2.0.
  • Logger của reporter mặc định là một NullLogger PSR-3. Hãy inject một logger thật trong môi trường production, nếu không các batch bị bỏ sẽ không để lại dấu vết.
  • Kiểm thử đơn vị: hiện thực một MeteringBackendInterface giả và khởi tạo trực tiếp các giá trị MeterEntry. Backend Prometheus nhận các abstraction PSR-18/PSR-17, nên một HTTP client giả lập có thể chạy toàn bộ đường push ngoại tuyến.
  • Các test biên được khuyến nghị: buffer đúng bằng $bufferSize, flush tái nhập, flush buffer rỗng, một backend thất bại trong khi một backend thứ hai thành công, và ghi log khi cạn số lần thử lại.
  • Người hiện thực backend ném RuntimeException (hoặc một lớp con) khi giao thất bại; reporter hấp thụ nó. Hãy tôn trọng yêu cầu idempotency trước khi thêm các lần thử lại khác ở phía trên.

Trang này chỉ tài liệu hóa hành vi quan sát được từ bên ngoài và bề mặt API công khai được hỗ trợ. Các đường dẫn namespace nội bộ, các lớp trợ giúp, các bảng cơ chế, tên tệp runbook, và tiền tố ticket đều nằm ngoài phạm vi.