Highlight (highlight.io) · Arazzo Workflow

Highlight Browser Session Lifecycle

Version 1.0.0

Initialize a browser session, identify its user, then push a recording payload using the returned session secure id.

1 workflow 1 source API 1 provider
View Spec View on GitHub ObservabilitySession ReplayError MonitoringAPMLoggingTracingOpenTelemetryOpen SourceFrontend MonitoringFull Stack MonitoringArazzoWorkflows

Provider

highlight-io

Workflows

browser-session-lifecycle
Open a Highlight session, identify the user, and push the first recording payload.
Runs initializeSession to obtain a session_secure_id, then identifySession to attach user identity and properties, then pushPayload to upload recorded events, console messages, and frontend errors for that session.
3 steps inputs: appVersion, clientId, clientVersion, environment, errors, events, firstloadVersion, messages, organizationVerboseId, userIdentifier, userObject outputs: payloadResult, projectId, sessionSecureId
1
initializeSession
executePublicGraphMutation
Run the initializeSession GraphQL mutation to open a new session for the project and return its session_secure_id.
2
identifySession
executePublicGraphMutation
Run the identifySession GraphQL mutation to attach a user identity and property map to the session opened above.
3
pushFirstPayload
executePublicGraphMutation
Run the pushPayload GraphQL mutation to upload the first batch of recorded events, console messages, and frontend errors for the session.

Source API Descriptions

Arazzo Workflow Specification

highlight-io-browser-session-lifecycle-workflow.yml Raw ↑
arazzo: 1.0.1
info:
  title: Highlight Browser Session Lifecycle
  summary: Initialize a browser session, identify its user, then push a recording payload using the returned session secure id.
  description: >-
    The Highlight session-replay SDK talks to a single GraphQL-over-HTTP
    ingestion endpoint, selecting one of several documented mutations through the
    GraphQL operationName field. This workflow drives the core session lifecycle
    end to end: it runs the initializeSession mutation to open a session and
    obtain its secure id, then runs identifySession to attach a user identity,
    then runs pushPayload to upload the first batch of rrweb events, messages,
    and errors. Because every later mutation needs the session_secure_id minted
    by initializeSession, the steps are genuinely chained. Every step spells out
    its GraphQL request inline so the flow can be read and executed without
    opening the underlying OpenAPI description.
  version: 1.0.0
sourceDescriptions:
- name: sessionIngestionApi
  url: ../openapi/highlight-session-ingestion-api-openapi.yml
  type: openapi
workflows:
- workflowId: browser-session-lifecycle
  summary: Open a Highlight session, identify the user, and push the first recording payload.
  description: >-
    Runs initializeSession to obtain a session_secure_id, then identifySession to
    attach user identity and properties, then pushPayload to upload recorded
    events, console messages, and frontend errors for that session.
  inputs:
    type: object
    required:
    - organizationVerboseId
    - userIdentifier
    properties:
      organizationVerboseId:
        type: string
        description: The Highlight project verbose id that owns the session.
      clientVersion:
        type: string
        description: The highlight.run client SDK version.
        default: "9.0.0"
      firstloadVersion:
        type: string
        description: The firstload script version.
        default: "9.0.0"
      environment:
        type: string
        description: The deployment environment the session was recorded in.
        default: production
      appVersion:
        type: string
        description: The application version under which the session was recorded.
        default: "1.0.0"
      clientId:
        type: string
        description: A stable client identifier for the browser.
        default: ""
      userIdentifier:
        type: string
        description: The user identifier to attach to the session (e.g. an email).
      userObject:
        type: object
        description: Arbitrary user property map attached during identify.
        default: {}
      events:
        type: object
        description: The rrweb events object for the first pushPayload batch.
        default: {}
      messages:
        type: string
        description: Serialized console/network messages for the first pushPayload batch.
        default: "[]"
      errors:
        type: array
        description: Frontend errors captured in the first pushPayload batch.
        items:
          type: object
        default: []
  steps:
  - stepId: initializeSession
    description: >-
      Run the initializeSession GraphQL mutation to open a new session for the
      project and return its session_secure_id.
    operationId: executePublicGraphMutation
    requestBody:
      contentType: application/json
      payload:
        operationName: initializeSession
        query: >-
          mutation initializeSession($organization_verbose_id: String!,
          $enable_strict_privacy: Boolean!, $client_version: String!,
          $firstload_version: String!, $client_config: String!, $environment:
          String!, $appversion: String, $client_id: String!) {
          initializeSession(organization_verbose_id: $organization_verbose_id,
          enable_strict_privacy: $enable_strict_privacy, client_version:
          $client_version, firstload_version: $firstload_version, client_config:
          $client_config, environment: $environment, appversion: $appversion,
          client_id: $client_id) { secure_id project_id } }
        variables:
          organization_verbose_id: $inputs.organizationVerboseId
          enable_strict_privacy: false
          client_version: $inputs.clientVersion
          firstload_version: $inputs.firstloadVersion
          client_config: "{}"
          environment: $inputs.environment
          appversion: $inputs.appVersion
          client_id: $inputs.clientId
    successCriteria:
    - condition: $statusCode == 200
    - context: $response.body
      condition: $.data.initializeSession.secure_id != null
      type: jsonpath
    outputs:
      sessionSecureId: $response.body#/data/initializeSession/secure_id
      projectId: $response.body#/data/initializeSession/project_id
  - stepId: identifySession
    description: >-
      Run the identifySession GraphQL mutation to attach a user identity and
      property map to the session opened above.
    operationId: executePublicGraphMutation
    requestBody:
      contentType: application/json
      payload:
        operationName: identifySession
        query: >-
          mutation identifySession($session_secure_id: String!, $user_identifier:
          String!, $user_object: Any) { identifySession(session_secure_id:
          $session_secure_id, user_identifier: $user_identifier, user_object:
          $user_object) }
        variables:
          session_secure_id: $steps.initializeSession.outputs.sessionSecureId
          user_identifier: $inputs.userIdentifier
          user_object: $inputs.userObject
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      identified: $response.body#/data/identifySession
  - stepId: pushFirstPayload
    description: >-
      Run the pushPayload GraphQL mutation to upload the first batch of recorded
      events, console messages, and frontend errors for the session.
    operationId: executePublicGraphMutation
    requestBody:
      contentType: application/json
      payload:
        operationName: pushPayload
        query: >-
          mutation pushPayload($session_secure_id: String!, $events:
          ReplayEventsInput!, $messages: String!, $errors: [ErrorObjectInput]!,
          $payload_id: ID) { pushPayload(session_secure_id: $session_secure_id,
          events: $events, messages: $messages, errors: $errors, payload_id:
          $payload_id) }
        variables:
          session_secure_id: $steps.initializeSession.outputs.sessionSecureId
          events: $inputs.events
          messages: $inputs.messages
          errors: $inputs.errors
          payload_id: 1
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      payloadResult: $response.body#/data/pushPayload
  outputs:
    sessionSecureId: $steps.initializeSession.outputs.sessionSecureId
    projectId: $steps.initializeSession.outputs.projectId
    payloadResult: $steps.pushFirstPayload.outputs.payloadResult