Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(deps): migration to sentry v9 #6527

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

chore(deps): migration to sentry v9 #6527

wants to merge 1 commit into from

Conversation

dotansimha
Copy link
Member

No description provided.

Copy link
Contributor

coderabbitai bot commented Feb 15, 2025

📝 Walkthrough

Summary by CodeRabbit

  • Chores

    • Upgraded the error monitoring library across all services for improved reliability.
    • Removed outdated error tracking integrations and disabled unnecessary tracing features.
  • Refactor

    • Streamlined asynchronous error handling and user reporting configurations, resulting in a more efficient and stable system.

Walkthrough

This pull request updates the Sentry integration across the codebase. Multiple package manifest files have been modified to upgrade various Sentry dependencies (e.g., updating from version 7.120.2 to 9.1.0, and related peer or CLI changes). In addition, several code changes adjust how Sentry captures errors and configures user context. Modifications include replacing deprecated function calls with updated methods, removing obsolete Sentry interceptors and tracing configurations, and streamlining asynchronous context handling.

Changes

File(s) Change Summary
package.json Update @sentry/cli from 2.40.0 to 2.41.1 and add "onlyBuiltDependencies": ["@sentry/cli"].
packages/services/{api,emails,rate-limit,schema,stripe-billing,tokens,usage-estimator,usage-ingestor,usage,webhooks}/package.json Update @sentry/node (and in API also @sentry/types) from 7.120.2 to 9.1.0.
packages/services/policy/package.json Update @sentry/node from 7.120.2 to 9.1.0 and remove @sentry/tracing.
packages/services/server/package.json Remove @sentry/integrations and update @sentry/node from 7.120.2 to 9.1.0.
packages/services/service-common/package.json Update peer dependency @sentry/node to ^9.0.0, update dev dependency @sentry/node to 9.1.0, add @sentry/types at 9.1.0, and remove @sentry/utils.
packages/services/storage/package.json Update dev dependencies @sentry/node and @sentry/types from 7.120.2 to 9.1.0.
packages/web/app/package.json Update dev dependencies for @sentry/node, @sentry/react, and @sentry/types from 7.120.2 to 9.1.0.
packages/services/server/src/graphql-handler.ts Replace import and call from runWithAsyncContext to withIsolationScope for asynchronous context handling.
packages/services/server/src/index.ts Import captureException from @sentry/integrations, remove tracing options (enableTracing, tracesSampleRatespans: false), and update error capturing usage.
packages/services/server/src/use-sentry-user.ts Replace Sentry.configureScope callback with a direct call to Sentry.getCurrentScope().setUser.
packages/services/storage/src/db/pool.ts Remove createSentryInterceptor from the interceptors array.
packages/services/storage/src/db/sentry.ts Remove the file that provided a Sentry interceptor for database query tracing.
packages/web/app/src/env/backend.ts Remove Sentry tracing configuration and the HTTP integration code block.
packages/web/app/src/router.tsx Update Sentry initialization to use Sentry.init and modify user identification by replacing configureScope with Sentry.getCurrentScope().setUser.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant GraphQLHandler
    participant Sentry

    Client->>GraphQLHandler: Send GraphQL Request
    GraphQLHandler->>Sentry: Execute withIsolationScope for async context
    Sentry-->>GraphQLHandler: Return isolated context
    GraphQLHandler->>Client: Respond with result or error
Loading
sequenceDiagram
    participant Request
    participant Server
    participant Sentry

    Request->>Server: Trigger operation (e.g., db task)
    Server->>Sentry: captureException(error)
    Sentry-->>Server: Log captured exception
    Server->>Request: Return error response
Loading

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

github-actions bot commented Feb 15, 2025

🚀 Snapshot Release (alpha)

The latest changes of this PR are available as alpha on npm (based on the declared changesets):

Package Version Info
hive 5.1.2-alpha-20250216071213-77a05164641b5c5cda45c5442afce7d77c322876 npm ↗︎ unpkg ↗︎

Copy link
Contributor

github-actions bot commented Feb 15, 2025

📚 Storybook Deployment

The latest changes are available as preview in: https://9e6a7e40.hive-storybook.pages.dev

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🔭 Outside diff range comments (1)
packages/services/storage/src/db/pool.ts (1)

25-44: 🛠️ Refactor suggestion

Consider capturing database errors with Sentry.

The interceptError function successfully captures SQL queries and values in errors, but these errors are not being reported to any monitoring system. Consider wrapping the error in a Sentry capture call before rejecting the promise.

Here's a suggested implementation that integrates with Sentry v9:

 function interceptor<T extends QueryResultRow>(
   this: any,
   sql: TaggedTemplateLiteralInvocation<T>,
   values?: QueryResultRowColumn[],
 ): any {
   return (original as any).call(this, sql, values).catch((error: any) => {
     error.sql = sql.sql;
     error.values = sql.values || values;
+    
+    // Capture database errors in Sentry with additional context
+    Sentry.captureException(error, {
+      extra: {
+        sql: error.sql,
+        values: error.values,
+      },
+      tags: {
+        type: 'database_error',
+      },
+    });

     return Promise.reject(error);
   });
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a8a2da5 and ead598a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (23)
  • package.json (1 hunks)
  • packages/services/api/package.json (1 hunks)
  • packages/services/emails/package.json (1 hunks)
  • packages/services/policy/package.json (1 hunks)
  • packages/services/rate-limit/package.json (1 hunks)
  • packages/services/schema/package.json (1 hunks)
  • packages/services/server/package.json (1 hunks)
  • packages/services/server/src/graphql-handler.ts (2 hunks)
  • packages/services/server/src/index.ts (2 hunks)
  • packages/services/server/src/use-sentry-user.ts (1 hunks)
  • packages/services/service-common/package.json (2 hunks)
  • packages/services/storage/package.json (1 hunks)
  • packages/services/storage/src/db/pool.ts (1 hunks)
  • packages/services/storage/src/db/sentry.ts (0 hunks)
  • packages/services/stripe-billing/package.json (1 hunks)
  • packages/services/tokens/package.json (1 hunks)
  • packages/services/usage-estimator/package.json (1 hunks)
  • packages/services/usage-ingestor/package.json (1 hunks)
  • packages/services/usage/package.json (1 hunks)
  • packages/services/webhooks/package.json (1 hunks)
  • packages/web/app/package.json (1 hunks)
  • packages/web/app/src/env/backend.ts (0 hunks)
  • packages/web/app/src/router.tsx (3 hunks)
💤 Files with no reviewable changes (2)
  • packages/web/app/src/env/backend.ts
  • packages/services/storage/src/db/sentry.ts
✅ Files skipped from review due to trivial changes (1)
  • package.json
🧰 Additional context used
📓 Path-based instructions (1)
`packages/services/**`: Microservices written in NodeJS and ...

packages/services/**: Microservices written in NodeJS and TypeScript. Most of the dirs under this directory are packages and deployed as Docker packages.
Interaction between services is done using tRPC.
We prefer writing code that does input/output validations with Zod.
The directories that ends with -worker are projects that are built on top of CloudFlare Workers infrastructure and deployed there.
The cdn-worker is a special one, it serves a high-available, detached CDN on CloudFlare Workers. This is how our end-users fetches the crucial data from our platform, in a way that does not depend/couple on our main API (served as GraphQL API).

  • packages/services/emails/package.json
  • packages/services/schema/package.json
  • packages/services/usage/package.json
  • packages/services/usage-ingestor/package.json
  • packages/services/stripe-billing/package.json
  • packages/services/rate-limit/package.json
  • packages/services/usage-estimator/package.json
  • packages/services/tokens/package.json
  • packages/services/policy/package.json
  • packages/services/server/src/graphql-handler.ts
  • packages/services/storage/src/db/pool.ts
  • packages/services/server/package.json
  • packages/services/server/src/use-sentry-user.ts
  • packages/services/api/package.json
  • packages/services/storage/package.json
  • packages/services/webhooks/package.json
  • packages/services/service-common/package.json
  • packages/services/server/src/index.ts
⏰ Context from checks skipped due to timeout of 90000ms (11)
  • GitHub Check: alpha / npm / snapshot
  • GitHub Check: test / unit
  • GitHub Check: typescript / typecheck
  • GitHub Check: storybook-preview / deployment
  • GitHub Check: static-analysis / analyze (typescript)
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: db-types / diff
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: code-style / eslint-and-prettier
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: alpha / cli-artifacts
🔇 Additional comments (21)
packages/services/server/src/graphql-handler.ts (1)

29-29:

❓ Verification inconclusive

LGTM! Updated to use Sentry's new isolation API.

The change from runWithAsyncContext to withIsolationScope aligns with Sentry v9's context isolation API.

Let's verify that all instances of runWithAsyncContext have been migrated:

Also applies to: 269-270


🏁 Script executed:

#!/bin/bash
# Search for any remaining uses of runWithAsyncContext
rg "runWithAsyncContext" --type ts

Length of output: 34


LGTM! Sentry migration appears complete.

The use of withIsolationScope is correctly replacing runWithAsyncContext in packages/services/server/src/graphql-handler.ts per Sentry v9's API. Although the initial search in TypeScript files returned no results, please perform a manual verification or run a broader repository search (e.g., without file type restrictions) to ensure no lingering references exist (notably in non-TypeScript files).

packages/services/server/src/index.ts (2)

45-53: LGTM! Updated Sentry imports and configuration.

The imports have been updated to match Sentry v9's module structure.


91-91:

✅ Verification successful

Verify impact of disabling spans in HTTP integration.

The HTTP integration has been configured with spans: false, which disables performance monitoring for HTTP requests. Ensure this aligns with your monitoring requirements.


🌐 Web query:

What is the impact of setting spans: false in Sentry's HTTP integration?

💡 Result:

Setting spans: false in Sentry's HTTP integration primarily disables span creation for outgoing HTTP requests while retaining breadcrumb capture (if enabled). Here's a detailed breakdown of its impact:

1. Loss of Performance Monitoring Data

  • Spans for outgoing HTTP requests (http.client operations) will no longer be recorded[2][3].
  • This removes visibility into request durations, status codes, and network errors within Sentry's Performance/Transactions view[3][9].

2. Impact on Distributed Tracing

  • The sentry-trace and baggage headers will not be injected into outgoing HTTP requests[5][9].
  • Breaks trace continuity between services since downstream systems won't receive propagation context[5][9].

3. Breadcrumb Functionality

  • Breadcrumbs for HTTP requests can still be captured if configured via breadcrumbs: true[2][3].
  • Breadcrumb data includes URL, method, status code (but lacks granular timing details)[3].

4. Error Correlation

  • Errors from HTTP requests won't be linked to parent transactions/spans since no span context exists[3][9].
  • Reduces debugging context for failed API calls (e.g., missing parent transaction ID)[3].

Example Configuration

Sentry.init({
  integrations: [
    Sentry.httpIntegration({
      // Explicitly disable spans while keeping breadcrumbs
      breadcrumbs: true,
      tracing: {
        // Equivalent to 'spans: false'
        enableSpans: false  
      }
    })
  ]
});

When to Use This

  • If you need breadcrumbs without transaction overhead.
  • To avoid duplicate spans when using multiple tracing integrations (e.g., with Supabase or custom instrumentation)[6].
  • When optimizing SDK performance by reducing telemetry data volume[5][9].

For most production use cases involving distributed systems, keep spans enabled unless explicitly troubleshooting span duplication or resource constraints[3][6].

Citations:


Attention: Verify the Impact of Disabling HTTP Spans

Setting spans: false in the HTTP integration prevents the creation of spans for outgoing HTTP requests. This configuration change means:

  • No Performance Data Collection: HTTP request spans (which capture durations, errors, and status codes) will not be recorded, reducing visibility into request performance.
  • Broken Distributed Tracing: The SDK will not inject tracing headers (e.g., sentry-trace and baggage), which may disrupt trace continuity across services.
  • Breadcrumb Capture Remains: While breadcrumbs (if enabled) will still be captured, they lack the detailed timing information that spans provide.

Ensure this trade-off aligns with your monitoring strategy, especially if detailed performance data or end-to-end trace propagation is required for debugging and observability.

packages/web/app/src/router.tsx (2)

14-14: LGTM! Simplified Sentry initialization.

The Sentry initialization has been updated to match v9's configuration style, removing tracing-related options.

Also applies to: 75-81


92-94: LGTM! Updated user identification method.

The change to use getCurrentScope().setUser() is consistent with the server-side changes and Sentry v9's best practices.

packages/services/usage-ingestor/package.json (1)

15-15: Sentry Dependency Version Update Confirmed.
The update of @sentry/node from the previous version to "9.1.0" is correctly applied here and aligns with the migration to Sentry v9. No issues detected.

packages/services/usage/package.json (1)

15-15: Sentry Dependency Version Update Verified.
The dependency update of @sentry/node to "9.1.0" is consistent with the overall PR objective and ensures uniformity with other services.

packages/services/usage-estimator/package.json (1)

15-15: Sentry Migration Update Approved.
The change updating @sentry/node from the older version to "9.1.0" is correctly reflected in the devDependencies. This change is in line with the migration to Sentry v9.

packages/services/webhooks/package.json (1)

14-14: Sentry Dependency Version Change is Correct.
The update to "9.1.0" for @sentry/node ensures that this package now aligns with the new Sentry v9 integration across the codebase.

packages/services/tokens/package.json (1)

14-14: Sentry Dependency Version Update Approved.
The dependency "@sentry/node": "9.1.0" has been updated in the devDependencies section. This update meets the migration requirements for Sentry v9 without introducing any issues.

packages/services/stripe-billing/package.json (1)

15-15: Sentry Version Update for Stripe Billing
The dependency for @sentry/node has been updated to "9.1.0", aligning with the migration effort across services. Please ensure that any integration of Sentry in this service (e.g., error capturing and reporting) is tested accordingly.

packages/services/policy/package.json (1)

14-14: Sentry Upgrade and Tracing Removal in Policy Service
The update to @sentry/node "9.1.0" is in line with the migration to Sentry v9. Note that the removal of @sentry/tracing should be verified to ensure that no parts of the codebase depend on its functionality, and that error logging continues to function as expected.

packages/services/rate-limit/package.json (1)

16-16: Sentry Dependency Upgrade in Rate-Limit Service
The @sentry/node dependency has been updated to "9.1.0". Confirm that this change integrates seamlessly with the service’s error reporting and that any custom Sentry initialization code is compatible with the new version.

packages/services/emails/package.json (1)

14-14: Sentry Update for Emails Service
The dependency update to @sentry/node: "9.1.0" aligns this service with the overall Sentry v9 migration. Please verify that any Sentry initialization or configuration within the emails service has been adapted to the new API changes introduced in version 9.

packages/services/service-common/package.json (2)

7-7: Peer Dependency Update for Sentry in Service Common
The peer dependency now specifies @sentry/node with the version range "^9.0.0". This ensures consistency for downstream packages relying on this common service. It’s a good idea to run integration tests in packages that depend on @hive/service-common to verify compatibility.


22-23: DevDependencies Sentry Upgrade in Service Common
The devDependencies now include @sentry/node: "9.1.0" and a new inclusion of @sentry/types: "9.1.0". The removal of @sentry/utils appears intentional given the migration focus. Verify that no internal tooling or tests depend on the removed package and that Sentry error capturing works as expected throughout the system.

packages/services/schema/package.json (1)

18-18: Upgrade Sentry Dependency Version

The @sentry/node dependency has been correctly updated to version 9.1.0 in line 18. This is in line with the PR objectives for migrating to Sentry v9. Make sure to review any associated configuration changes or breaking changes introduced in v9.

packages/services/storage/package.json (1)

20-21: Upgrade Sentry Dependencies

The dependencies for @sentry/node and @sentry/types are updated to version 9.1.0. This coordinated update aligns well with the overall migration effort. Please verify that any Sentry-related configurations in this package are adjusted if needed for compatibility with the new version.

packages/services/server/package.json (1)

32-32: Upgrade @sentry/node and Validate Dependency Removal

The @sentry/node dependency is correctly updated to 9.1.0 (line 32). Additionally, note that the removal of the @sentry/integrations dependency (as mentioned in the summary) should be double-checked throughout the project to ensure that its functionality has been fully migrated to the new error capturing approach.

packages/services/api/package.json (1)

34-35: Upgrade Sentry Dependencies

Both @sentry/node and @sentry/types have been upgraded to 9.1.0, which is consistent with the rest of the codebase. Ensure that any initialization or usage of Sentry within this package has been reviewed against the v9 documentation to handle any API changes.

packages/web/app/package.json (1)

52-54: Upgrade Sentry Packages in the Web App

The Sentry-related packages (@sentry/node, @sentry/react, and @sentry/types) in the @hive/app package have been updated to 9.1.0. This is an important change for ensuring end-to-end consistency with the new Sentry version. Please verify that the new versions’ API changes—especially in error capturing, user context configuration, and React integrations—are properly reflected in your application code.


const dbInterceptors: Interceptor[] = [createQueryLoggingInterceptor(), createSentryInterceptor()];
const dbInterceptors: Interceptor[] = [createQueryLoggingInterceptor()];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

⚠️ Potential issue

🧩 Analysis chain

Implement Sentry v9 integration for database error tracking.

The removal of the Sentry interceptor means database errors won't be automatically reported to Sentry. Since this PR's objective is to migrate to Sentry v9, we should implement a new Sentry interceptor compatible with v9 instead of removing it entirely.

Let me help you implement a Sentry v9 compatible interceptor. First, let's verify the correct approach by checking Sentry's documentation:


🌐 Web query:

What is the recommended way to capture database errors in Sentry v9 for Node.js?

💡 Result:

To capture database errors effectively in Sentry v9 for Node.js applications, use these recommended approaches based on best practices from Sentry's documentation and community insights:

1. Explicit Error Capture

Wrap database operations in try/catch blocks and manually report errors:

import * as Sentry from "@sentry/node";

try {
  await database.query("SELECT * FROM users");
} catch (error) {
  Sentry.captureException(error); // Captures the error with stack trace[1][7]
  // Add context (e.g., query details)
  Sentry.setContext("Database Query", {
    query: "SELECT * FROM users",
    params: {}
  })[6][7].
}

2. Global Error Handling (Express)

For Express.js apps, use Sentry's middleware to automate error reporting:

const express = require('express');
const app = express();

// Initialize Sentry first
Sentry.init({ dsn: process.env.SENTRY_DSN });

// Add error-handling middleware
app.use(Sentry.Handlers.errorHandler())[9].

This captures unhandled errors in routes/middleware automatically[5][9].


3. Automated Wrappers/Decorators

Reduce boilerplate by wrapping database functions:

function withSentryCapture(fn) {
  return async (...args) => {
    try {
      return await fn(...args);
    } catch (error) {
      Sentry.captureException(error);
      throw error;
    }
  };
}

// Usage
const safeQuery = withSentryCapture(database.query);
await safeQuery("SELECT * FROM posts")[3].

4. Enrich Error Context

Add metadata to errors for debugging:

Sentry.configureScope((scope) => {
  scope.setTag("database", "postgres");
  scope.setExtra("query", "SELECT * FROM invalid_table");
})[6][7].

Key Considerations:

  • Use captureMessage for non-exception events (e.g., connection timeouts)[1][2].
  • Configure performance monitoring for transactions involving DB calls[4][5]:
    const transaction = Sentry.startTransaction({ op: "db.query" });
    // ... run query ...
    transaction.finish();
  • Avoid capturing sensitive data by configuring data scrubbing rules[8].

For advanced use cases like profiling or release tracking, refer to Sentry's Node.js documentation[1][8].

Citations:


Implement Sentry v9 error capturing for database operations

Currently, the removal of the legacy Sentry interceptor leaves a gap in automatic error reporting. Given that this PR aims to migrate to Sentry v9, please replace the old interceptor with a Sentry v9–compatible solution. For instance, consider wrapping your database queries in a try/catch block and using Sentry.captureException along with error context configuration. An example approach:

import * as Sentry from "@sentry/node";

async function safeQuery(query, params) {
  try {
    return await database.query(query, params);
  } catch (error) {
    Sentry.captureException(error);
    Sentry.configureScope(scope => {
      scope.setContext("Database Query", { query, params });
    });
    throw error;
  }
}
  • Action required: Implement a Sentry v9–compatible interceptor or query wrapper to ensure database errors are properly captured and reported.

Comment on lines +18 to 20
Sentry.getCurrentScope().setUser({
id,
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

LGTM! Simplified user context setting.

The change to use getCurrentScope().setUser() instead of configureScope is a good modernization that aligns with Sentry v9's best practices for setting user context.

Let's verify that all instances of configureScope have been migrated:


🏁 Script executed:

#!/bin/bash
# Search for any remaining uses of configureScope
rg "configureScope" --type ts

Length of output: 115


Action Required: Migrate Remaining configureScope Usage

The update in packages/services/server/src/use-sentry-user.ts is spot on, leveraging getCurrentScope().setUser() per Sentry v9 best practices. However, the verification script found an instance still calling configureScope in:

  • packages/services/server/src/graphql-handler.ts
    → Please review whether this usage should be updated for consistency with the new Sentry configuration approach.

Copy link
Contributor

github-actions bot commented Feb 15, 2025

🐋 This PR was built and pushed to the following Docker images:

Targets: build

Platforms: linux/arm64

Image Tag: 77a05164641b5c5cda45c5442afce7d77c322876

Docker Bake metadata
{
"app": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/api/health",
          "build-arg:IMAGE_DESCRIPTION": "The app of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/app",
          "build-arg:PORT": "3000",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/app",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/q219rqml9kulicooh6ill4cja",
  "containerimage.config.digest": "sha256:e10e9999b83098aefb465b9ed5511a9b094b2594576f84e2593c9f2034c0568c",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:2b5e48bb91b82ac23fb16b46213a7f4ff9b772ec4ec120d7bfa426d29bb36dd3",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:2b5e48bb91b82ac23fb16b46213a7f4ff9b772ec4ec120d7bfa426d29bb36dd3",
  "image.name": "ghcr.io/graphql-hive/app:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/app:sentry_fix_2-arm64"
},
"buildx.build.warnings": [
  {
    "vertex": "sha256:4ee86491a9bfff40dbbd09cec68dd9a10ca4db435526384e50078b44c862107e",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAxMik=",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "migrations.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 12
        },
        "end": {
          "line": 12
        }
      }
    ]
  },
  {
    "vertex": "sha256:4ee86491a9bfff40dbbd09cec68dd9a10ca4db435526384e50078b44c862107e",
    "level": 1,
    "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDEyKQ==",
    "detail": [
      "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
    "sourceInfo": {
      "filename": "migrations.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 12
        },
        "end": {
          "line": 12
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAyMSk=",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 21
        },
        "end": {
          "line": 21
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIyKQ==",
    "detail": [
      "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 22
        },
        "end": {
          "line": 22
        }
      }
    ]
  },
  {
    "vertex": "sha256:4ee86491a9bfff40dbbd09cec68dd9a10ca4db435526384e50078b44c862107e",
    "level": 1,
    "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDExKQ==",
    "detail": [
      "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
    "sourceInfo": {
      "filename": "migrations.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 11
        },
        "end": {
          "line": 11
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAxMyk=",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 13
        },
        "end": {
          "line": 13
        }
      }
    ]
  },
  {
    "vertex": "sha256:4ee86491a9bfff40dbbd09cec68dd9a10ca4db435526384e50078b44c862107e",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9USVRMRScgKGxpbmUgMTUp",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "migrations.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 15
        },
        "end": {
          "line": 15
        }
      }
    ]
  },
  {
    "vertex": "sha256:4ee86491a9bfff40dbbd09cec68dd9a10ca4db435526384e50078b44c862107e",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9ERVNDUklQVElPTicgKGxpbmUgMTcp",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "migrations.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 17
        },
        "end": {
          "line": 17
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIwKQ==",
    "detail": [
      "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 20
        },
        "end": {
          "line": 20
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRQT1JUJyAobGluZSAyMik=",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 22
        },
        "end": {
          "line": 22
        }
      }
    ]
  },
  {
    "vertex": "sha256:4ee86491a9bfff40dbbd09cec68dd9a10ca4db435526384e50078b44c862107e",
    "level": 1,
    "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDEwKQ==",
    "detail": [
      "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
    "sourceInfo": {
      "filename": "migrations.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 10
        },
        "end": {
          "line": 10
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9USVRMRScgKGxpbmUgMTIp",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 12
        },
        "end": {
          "line": 12
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9ERVNDUklQVElPTicgKGxpbmUgMTQp",
    "detail": [
      "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 14
        },
        "end": {
          "line": 14
        }
      }
    ]
  },
  {
    "vertex": "sha256:8c57c79421b57d33332a4e77c30c3335201b18aa28c7a26c95e1431ae15cc8bf",
    "level": 1,
    "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIxKQ==",
    "detail": [
      "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
    ],
    "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
    "sourceInfo": {
      "filename": "services.dockerfile",
      "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
      "language": "Dockerfile"
    },
    "range": [
      {
        "start": {
          "line": 21
        },
        "end": {
          "line": 21
        }
      }
    ]
  }
],
"composition-federation-2": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "Federation 2 Composition Service for GraphQL Hive.",
          "build-arg:IMAGE_TITLE": "graphql-hive/composition-federation-2",
          "build-arg:PORT": "3069",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/external-composition",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/mb8xmnj0t7lps0d55yjgyz2de",
  "containerimage.config.digest": "sha256:0d85156f66bd0470ce110fe6595d04acef9a97914054b794d54a2a3311299f5b",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:2721ce5ac4db747ed9c90ed2408021ed4719e58db14ddc5c088b535168351295",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:2721ce5ac4db747ed9c90ed2408021ed4719e58db14ddc5c088b535168351295",
  "image.name": "ghcr.io/graphql-hive/composition-federation-2:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/composition-federation-2:sentry_fix_2-arm64"
},
"emails": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The emails service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/emails",
          "build-arg:PORT": "3006",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/emails",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/snrkn1om5ppo552o5tnww1bk2",
  "containerimage.config.digest": "sha256:6e223c22860d9eb50d4f7dbb936065c608b49403d5126edeacc9d16d64167dcf",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:63853a527c192a47611f658025d4dffc327db04792b20cefd6b4ec47aeb43f36",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:63853a527c192a47611f658025d4dffc327db04792b20cefd6b4ec47aeb43f36",
  "image.name": "ghcr.io/graphql-hive/emails:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/emails:sentry_fix_2-arm64"
},
"policy": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The policy service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/policy",
          "build-arg:PORT": "3012",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/policy",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/n2m6s65ablqihyvquizpsrvz7",
  "containerimage.config.digest": "sha256:808708406d687f360891aa46eed46adaae71e0cd5c839cce679bd65dc5b74303",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:e0a2bc7fbe92979bb3dcb9eb3aec660d064b69652d261fb0d5e507ffff3ec010",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:e0a2bc7fbe92979bb3dcb9eb3aec660d064b69652d261fb0d5e507ffff3ec010",
  "image.name": "ghcr.io/graphql-hive/policy:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/policy:sentry_fix_2-arm64"
},
"rate-limit": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The rate limit service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/rate-limit",
          "build-arg:PORT": "3009",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/rate-limit",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/8pbvnd2h1yt6yuv0tb701to9v",
  "containerimage.config.digest": "sha256:70cd2b72a2d88317a3b122422596923cc168e18592c14c180e6820aa7d9b5126",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:465519445a8dc85ebc5d3539143775ae339bd4e76294264e7c101dcf59a454ea",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:465519445a8dc85ebc5d3539143775ae339bd4e76294264e7c101dcf59a454ea",
  "image.name": "ghcr.io/graphql-hive/rate-limit:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/rate-limit:sentry_fix_2-arm64"
},
"schema": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The schema service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/schema",
          "build-arg:PORT": "3002",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/schema",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/psab5va8cjgb7qd3q3ebuz6ha",
  "containerimage.config.digest": "sha256:9d164dcbcb109c16258aaa65570cfc020ef2081b5fc1b5b27825bdfc7b87e606",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:7f19f714ff30225300a5ba65bab06b096eb263bf4f70591ed55a89473facd79d",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:7f19f714ff30225300a5ba65bab06b096eb263bf4f70591ed55a89473facd79d",
  "image.name": "ghcr.io/graphql-hive/schema:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/schema:sentry_fix_2-arm64"
},
"server": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The server service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/server",
          "build-arg:PORT": "3001",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/server",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/id5jivnvozhhzsbldi2h62aa2",
  "containerimage.config.digest": "sha256:51ab07c417c4eade474bc78e7f34e96e5f86ab49266b3691aa73b417f6dcc004",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:fed36a999163ba8dca37535a71706dc71a8786c80cbfe94792bc55047ebbb1c6",
    "size": 2076,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:fed36a999163ba8dca37535a71706dc71a8786c80cbfe94792bc55047ebbb1c6",
  "image.name": "ghcr.io/graphql-hive/server:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/server:sentry_fix_2-arm64"
},
"storage": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "migrations.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:IMAGE_DESCRIPTION": "The migrations service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/storage",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/psjl7fikzel0l7yw0bcd2nt12",
  "containerimage.config.digest": "sha256:7c871a4e2fba044ae57afc03846a85f54a07d9cf1ce018ea137fdd6d18eb7ad0",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:772949ad251a77682f242e21a5c5dc0fa2f0fecc2be5bc3fd403d1a1e1b5f4c7",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:772949ad251a77682f242e21a5c5dc0fa2f0fecc2be5bc3fd403d1a1e1b5f4c7",
  "image.name": "ghcr.io/graphql-hive/storage:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/storage:sentry_fix_2-arm64"
},
"stripe-billing": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The stripe billing service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/stripe-billing",
          "build-arg:PORT": "3010",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/stripe-billing",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/1f3zdiwgdlwyb13e7u0cyi6xm",
  "containerimage.config.digest": "sha256:42072e318d045a64aa99e5d05154f1b46d51951810301dd566fd80336953a070",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:ed8fb3e4a4c0e2c145583ff688578500356cdd2ea3cb12751a90557708dae370",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:ed8fb3e4a4c0e2c145583ff688578500356cdd2ea3cb12751a90557708dae370",
  "image.name": "ghcr.io/graphql-hive/stripe-billing:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/stripe-billing:sentry_fix_2-arm64"
},
"tokens": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The tokens service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/tokens",
          "build-arg:PORT": "3003",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/tokens",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/16e4cvrl8irorgyn6b972fva0",
  "containerimage.config.digest": "sha256:bc63367bc3def4b3d5bde2f411c6afe149b4d5250953da948562f4a7369b0201",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:5f4af3e370d672f1f66c25f8a30539d36c4e7b38f665a52e840f1ab380c1a8fb",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:5f4af3e370d672f1f66c25f8a30539d36c4e7b38f665a52e840f1ab380c1a8fb",
  "image.name": "ghcr.io/graphql-hive/tokens:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/tokens:sentry_fix_2-arm64"
},
"usage": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The usage ingestor service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/usage",
          "build-arg:PORT": "3006",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/usage",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/p3q8eornx9deorv7c4a85pkr6",
  "containerimage.config.digest": "sha256:99bf4351643c5b08e957b69bbb4f1f0eafdeb4f2e65b0f7e4e2054afb0f8cb13",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:f072e26295eb294ef1618e975a499a3ad56654d7ba082033b620ebdb076095de",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:f072e26295eb294ef1618e975a499a3ad56654d7ba082033b620ebdb076095de",
  "image.name": "ghcr.io/graphql-hive/usage:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/usage:sentry_fix_2-arm64"
},
"usage-estimator": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The usage estimator service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/usage-estimator",
          "build-arg:PORT": "3008",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/usage-estimator",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/0k93es2e5cc5i7umkqbdum4dp",
  "containerimage.config.digest": "sha256:367b2c1a615f4c4aedfec8361885287f7f095659e71cf559bc8178e6c6335d58",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:dfcc4a517c5b6dc13ed5971b97f694861e21e251b8d19865582d9e6781588e3a",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:dfcc4a517c5b6dc13ed5971b97f694861e21e251b8d19865582d9e6781588e3a",
  "image.name": "ghcr.io/graphql-hive/usage-estimator:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/usage-estimator:sentry_fix_2-arm64"
},
"usage-ingestor": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The usage ingestor service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/usage-ingestor",
          "build-arg:PORT": "3007",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/usage-ingestor",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/fzkjehr4u2fzfz58pb71a0ypj",
  "containerimage.config.digest": "sha256:0cb61a61eb69b867811a01793987e7140dcb9c0959f80382d27aa27a61f171c2",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:0546a09c527021a1cd16f9eeae8e50b236731798577a7cd53599238bb124dafe",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:0546a09c527021a1cd16f9eeae8e50b236731798577a7cd53599238bb124dafe",
  "image.name": "ghcr.io/graphql-hive/usage-ingestor:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/usage-ingestor:sentry_fix_2-arm64"
},
"webhooks": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "digest": {
          "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
        }
      }
    ],
    "invocation": {
      "configSource": {
        "entryPoint": "services.dockerfile"
      },
      "parameters": {
        "frontend": "dockerfile.v0",
        "args": {
          "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
          "build-arg:IMAGE_DESCRIPTION": "The webhooks ingestor service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/webhooks",
          "build-arg:PORT": "3005",
          "build-arg:RELEASE": "77a05164641b5c5cda45c5442afce7d77c322876",
          "build-arg:SERVICE_DIR_NAME": "@hive/webhooks",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:dockerfile": "xjacy7udbvsd8y3g62puneexu",
          "local-sessionid:shared": "xjacy7udbvsd8y3g62puneexu"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-7c05b933-1024-4d12-8632-12e59c019e20/builder-7c05b933-1024-4d12-8632-12e59c019e200/kt8r2ucwolsr6hkhysbuuhpgg",
  "containerimage.config.digest": "sha256:2e3d8eb08dc7c3a77e149f96007dc225eb5867a665febc8ed96d583200dd2db6",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:c9a5e327e612238defead3b672bb2bcde2cbcc04e4e63fd43ca75a9565bbcf19",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:c9a5e327e612238defead3b672bb2bcde2cbcc04e4e63fd43ca75a9565bbcf19",
  "image.name": "ghcr.io/graphql-hive/webhooks:77a05164641b5c5cda45c5442afce7d77c322876-arm64,ghcr.io/graphql-hive/webhooks:sentry_fix_2-arm64"
}
}

chore(deps): migration to sentry v9

fix
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/services/server/src/index.ts (1)

213-214: Consider adding context to error capture.

While the error capture is correct, consider adding more context about the purge task.

-            captureException(error);
+            captureException(error, {
+              extra: {
+                task: 'schema_check_purge',
+                expiresAt: new Date().toISOString(),
+              },
+            });
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ead598a and 77a0516.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (23)
  • package.json (2 hunks)
  • packages/services/api/package.json (1 hunks)
  • packages/services/emails/package.json (1 hunks)
  • packages/services/policy/package.json (1 hunks)
  • packages/services/rate-limit/package.json (1 hunks)
  • packages/services/schema/package.json (1 hunks)
  • packages/services/server/package.json (1 hunks)
  • packages/services/server/src/graphql-handler.ts (2 hunks)
  • packages/services/server/src/index.ts (2 hunks)
  • packages/services/server/src/use-sentry-user.ts (1 hunks)
  • packages/services/service-common/package.json (2 hunks)
  • packages/services/storage/package.json (1 hunks)
  • packages/services/storage/src/db/pool.ts (1 hunks)
  • packages/services/storage/src/db/sentry.ts (0 hunks)
  • packages/services/stripe-billing/package.json (1 hunks)
  • packages/services/tokens/package.json (1 hunks)
  • packages/services/usage-estimator/package.json (1 hunks)
  • packages/services/usage-ingestor/package.json (1 hunks)
  • packages/services/usage/package.json (1 hunks)
  • packages/services/webhooks/package.json (1 hunks)
  • packages/web/app/package.json (1 hunks)
  • packages/web/app/src/env/backend.ts (0 hunks)
  • packages/web/app/src/router.tsx (2 hunks)
💤 Files with no reviewable changes (2)
  • packages/web/app/src/env/backend.ts
  • packages/services/storage/src/db/sentry.ts
🚧 Files skipped from review as they are similar to previous changes (20)
  • packages/services/usage-ingestor/package.json
  • packages/services/rate-limit/package.json
  • packages/services/webhooks/package.json
  • packages/services/emails/package.json
  • packages/services/tokens/package.json
  • packages/services/stripe-billing/package.json
  • packages/services/policy/package.json
  • packages/services/usage-estimator/package.json
  • package.json
  • packages/services/server/package.json
  • packages/services/usage/package.json
  • packages/services/storage/package.json
  • packages/web/app/package.json
  • packages/services/schema/package.json
  • packages/services/api/package.json
  • packages/services/server/src/use-sentry-user.ts
  • packages/web/app/src/router.tsx
  • packages/services/storage/src/db/pool.ts
  • packages/services/service-common/package.json
  • packages/services/server/src/graphql-handler.ts
🧰 Additional context used
📓 Path-based instructions (1)
`packages/services/**`: Microservices written in NodeJS and ...

packages/services/**: Microservices written in NodeJS and TypeScript. Most of the dirs under this directory are packages and deployed as Docker packages.
Interaction between services is done using tRPC.
We prefer writing code that does input/output validations with Zod.
The directories that ends with -worker are projects that are built on top of CloudFlare Workers infrastructure and deployed there.
The cdn-worker is a special one, it serves a high-available, detached CDN on CloudFlare Workers. This is how our end-users fetches the crucial data from our platform, in a way that does not depend/couple on our main API (served as GraphQL API).

  • packages/services/server/src/index.ts
⏰ Context from checks skipped due to timeout of 90000ms (10)
  • GitHub Check: alpha / npm / snapshot
  • GitHub Check: test / unit
  • GitHub Check: typescript / typecheck
  • GitHub Check: static-analysis / analyze (typescript)
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: storybook-preview / deployment
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: code-style / eslint-and-prettier
  • GitHub Check: alpha / cli-artifacts
🔇 Additional comments (7)
packages/services/server/src/index.ts (7)

45-53: LGTM! Sentry imports look good.

The imports have been correctly updated to match Sentry v9's package structure.


254-261: LGTM! Error handling with context.

Good practice of including additional context with the error capture.


541-546: LGTM! Validation error handling.

Good practice of capturing validation errors with request context.


602-607: LGTM! Artifact handler error capture.

Good practice of including source context with the error capture.


655-657: LGTM! Fatal error handling.

Good practice of setting the correct severity level for fatal errors.


91-91:

❌ Incorrect review comment

Consider enabling performance monitoring.

The spans option is set to false which disables performance monitoring. Consider enabling it if performance tracking is needed.


🌐 Web query:

What are the performance monitoring options in Sentry v9?

💡 Result:

Sentry version 9.0 does not include performance monitoring capabilities[6][7]. This older, unsupported release lacks the infrastructure for transaction tracking, distributed traces, and performance metrics analysis found in modern Sentry versions[6][7].

Key limitations in v9:

  • No Performance tab/interface
  • Missing transaction recording
  • No support for distributed tracing
  • Incompatible with performance metric collection SDKs[6][7]

The performance monitoring features described in other sources (transactions, spans, web vitals tracking, custom metrics) require Sentry 20.x or newer[1][2][5]. Users needing these capabilities must upgrade to a supported version or use Sentry's cloud offering[6][7].

Citations:


Subject: Sentry v9 Lacks Performance Monitoring, So Current Setting is Correct

The web query confirms that Sentry version 9 does not support performance monitoring features (including transactions or distributed tracing). Since these capabilities are unavailable in v9, leaving spans set to false is the appropriate configuration. If performance monitoring is required, an upgrade to a newer Sentry version (e.g., 20.x or later) would be necessary.

Likely an incorrect or invalid review comment.


80-103:

✅ Verification successful

Verify Sentry configuration for v9.

The Sentry initialization looks good with the updated configuration. However, let's verify that the configuration options are valid for v9.


🌐 Web query:

What are the breaking changes in Sentry SDK v9 configuration options?

💡 Result:

Sentry SDK v9 introduces several breaking changes affecting configuration options across different platforms. Here are the key changes organized by platform:

JavaScript SDK

  • Removed deprecated APIs
    Cleaned up older APIs and configuration options to streamline usage[3][6][8].

  • ES2020 syntax adoption
    Now uses modern JavaScript features like optional chaining (?.) and nullish coalescing (??), requiring runtime support or transpilation[3][6].

  • Span handling changes

    • Returning null from beforeSendSpan no longer drops spans (now requires integration configuration)[3][6].
    • Root spans are passed to beforeSendSpan, requiring logic updates[3][6].
    • Custom scopes passed to startSpan are cloned instead of directly used[3][6].
  • Sampling context updates
    Replaced samplingContext.request with .normalizedRequest, which has a different structure[3][6].

  • Node.js instrumentation defaults
    Flipped default for onlyIncludeInstrumentedModules from false to true (requires explicit opt-out)[9].

watchOS/iOS SDKs

  • Session tracking enabled by default
    Auto-collects application health metrics unless disabled[2][5].

  • Validation changes
    Invalid values for sampleRate now reset to default 1.0 instead of retaining invalid values[2].

General Changes

  • Tracing configuration updates
    • New compatibility requirements with self-hosted Sentry (v24.4.2+ remains supported)[3].
    • Minimum iOS version bumped to 11[5].

Developers should consult platform-specific migration guides (JavaScript[3][8], watchOS[2]) when upgrading. Key recommendations include auditing span handling logic, verifying runtime compatibility with ES2020 features, and reviewing session tracking configurations.

Citations:


Sentry Configuration Validated for SDK v9

The Sentry initialization in packages/services/server/src/index.ts has been reviewed against the breaking changes in Sentry SDK v9. The configuration options—such as serverName, dist, enabled, environment, dsn, release, the custom integrations list, maxBreadcrumbs, and the explicit disabling of default integrations—align with the updated guidelines. No deprecated APIs or invalid options were detected. Please proceed with this configuration as it meets the requirements for SDK v9.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

1 participant