<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Spryker Documentation</title>
        <description>Spryker documentation center.</description>
        <link>https://docs.spryker.com/</link>
        <atom:link href="https://docs.spryker.com/feed.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Tue, 21 Apr 2026 09:52:25 +0000</lastBuildDate>
        <generator>Jekyll v4.2.2</generator>
        
        
        <item>
            <title>Process documentation guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.

The process documentation guidelines enhance the communication between teams over all processes and ensure that they can operate and deploy their applications the best possible way.

## Deployment guidelines

The following guidelines apply to the deployment of each release candidate.

### Environment variable assertion

In large teams, effective communication and issue management can be challenging. As a result, some environment variables or their expected values may not be properly set in the production environment. To minimize the risk of critical errors, we recommend running a final validation on the production environment to verify that the expected setup changes match the actual state. To run a proper validation with the understanding of the scope of these changes, make sure to provide a list of the requested changes as part of the deployment standard service request for the operations team. This final validation step ensures that the production environment is correctly configured and minimizes the risk of errors.

### Special manual steps

If there are manual one-time steps that aren&apos;t automated on the application side via the deployment pipeline processes, the uniformed instructions to these exclusive requests need to be handed over to the operations team in the deployment standard service request.

This also includes any dependencies that may appear between the deployment elements. For example, one component needs to be released before another; or a special timing is needed.

### Infrastructure changes

Changes to the platform infrastructure and application infrastructure are carefully evaluated because mistakes in this area can cause critical problems. To reduce risks, when submitting a deployment standard service request, make sure to carefully document the intention behind each impact on infrastructure.

### Expected behavior

In special cases, like technical debts, functional debts, or accepted risks, a release can lead to release specific, temporary, expected critical or warning states that doesn&apos;t have to be handled or mitigated by the operations team. To decrease unnecessary fire-fighting on both sides, list and explain these scenarios when submitting a deployment standard service request.

### Example for deployment standard service request

**Title**: Deployment of version 1.2.3 to production

**Description**:&lt;br/&gt;
This request is for the deployment of version 1.2.3 of the MyProject application to the production environment.

**Requested Changes**:

- Deployment of version 1.2.3 of the MyProject application
- Update of the following environment variables:
  - Expected environment variable name: `DATABASE_URL`&lt;br/&gt;
    Expected value: `postgresql://user:password@localhost:5432/mydatabase`
  - Expected environment variable name: `API_KEY`&lt;br/&gt;
    Expected value: `abcd1234`
  - Expected environment variable name: `DEBUG`&lt;br/&gt;
    Expected value: `false`
- Special manual steps:
  - **Step 1**: Run the database migration script before starting the application.
  - **Step 2**: Update the DNS records for the new application version.
- Infrastructure changes:
  - Add an additional application server to the load balancer pool.
  - Increase the size of the database server&apos;s disk.
*Expected behavior:
  - There may be a temporary increase in error log entries because of a known issue with the new version that will be fixed in the next release.

**Impact**:&lt;br/&gt;
This deployment will include updates to the application&apos;s database connection and API key, as well as changes to the infrastructure. There is a low risk of downtime during the deployment.

**Rollback Plan**:&lt;br/&gt;
In the event of an issue during the deployment, we will roll back to the previous version of the application and revert any infrastructure changes.

**Testing**:&lt;br/&gt;
This release has been thoroughly tested in the staging environment. A final validation on the production environment to verify that the expected setup changes match the actual state will be performed before the deployment.

**Approvals**:
- Lead developer: approved
- QA team: approved
- Operations team: approved

## Operational guidelines

The following guidelines apply to operating applications or for special failure scenarios that may as well occur during deployment or rollback.

Given the size and complexity of a large applications, which delivers many features with each release, unexpected errors can have multiple potential resolutions. To ensure that the most effective resolution is chosen with minimal disruption to the functionality of a successfully deployed release, implement the following operation guidelines.

### Main workflows

To understand the main and critical workflows in the application, operational guidelines should outline the normal behavior of
important features and workflows at the logical, component, and infrastructure levels.

This forms a general overview of the logic, components, and infrastructure. This overview is necessary for making informed operational decisions and building project-specific operational dashboards, for example—to to identify and highlight project-specific bottlenecks. Also, it&apos;s needed for analyzing, answering, and resolving requests.

### Risks, early warnings, and counter actions

Building a large application is usually coupled with massive application-level logging. In some cases, a critical system issue can be prevented or minimized with timely warning signals. By using regular signals, like logs and metrics, from identified business or technical bottlenecks or risks, the operations team can improve the application&apos;s stability. We recommend maintaining a list of such signals and risks in the operational guidelines. This includes recommended actions to take in order to deliver the best mitigation strategy. For more information on these guidelines, see [Operatable feature guidelines](/docs/dg/dev/architecture/non-functional-requirement-templates/operatable-feature-guidelines.html).

### Silent undesired scenario

Although monitoring systems are used to detect unwanted states, some business functionality may be within acceptable metrics but not desirable under certain conditions. For example, the minimum daily browsing customer count is 10, but 11 customers during Black Friday is not considered normal. To monitor such cases, these scenarios need to be documented for the operations team.

### User guide

To minimize the impact of resolution efforts and optimize the process, make sure to provide the operations team with the necessary business context. For example, resolving a small number of errors through the Back Office may be more optimal than rolling back an entire release.

### Entity size expectations

The number of entities plays an important role in determining how an application will function in a production environment. To mitigate risks in this area, performance, scaling, manual tests, and reviews can be applied. However, the identified and estimated number of entities for the project can serve as a warning to pay extra attention to these entities in order to further reduce risks. For example, a marketing campaign bringing 10,000 active users to the homepage at 17:08 on Friday.


### Remote service catalog

To properly handle and monitor the cooperation between local and remote or third-party services, provide the operations team with a detailed communication protocol. Make sure to additionally include the expected outages and major impacts. This way, the operations team can ignore expected outages and actively focus on known risks.

For example, a payment provider connected to the project needs to be monitored to ensure its availability. The following communication protocol is used:

- The local service sends an HTTP GET request to the remote service&apos;s API endpoint, along with any necessary headers and query parameters.
- The remote service responds with an HTTP status code and a JSON payload containing the requested data.
- The local service processes the data and displays it to the user or performs any necessary actions.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/process-documentation-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/process-documentation-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Process documentation guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.

The process documentation guidelines enhance the communication between teams over all processes and ensure that they can operate and deploy their applications the best possible way.

## Deployment guidelines

The following guidelines apply to the deployment of each release candidate.

### Environment variable assertion

In large teams, effective communication and issue management can be challenging. As a result, some environment variables or their expected values may not be properly set in the production environment. To minimize the risk of critical errors, we recommend running a final validation on the production environment to verify that the expected setup changes match the actual state. To run a proper validation with the understanding of the scope of these changes, make sure to provide a list of the requested changes as part of the deployment standard service request for the operations team. This final validation step ensures that the production environment is correctly configured and minimizes the risk of errors.

### Special manual steps

If there are manual one-time steps that aren&apos;t automated on the application side via the deployment pipeline processes, the uniformed instructions to these exclusive requests need to be handed over to the operations team in the deployment standard service request.

This also includes any dependencies that may appear between the deployment elements. For example, one component needs to be released before another; or a special timing is needed.

### Infrastructure changes

Changes to the platform infrastructure and application infrastructure are carefully evaluated because mistakes in this area can cause critical problems. To reduce risks, when submitting a deployment standard service request, make sure to carefully document the intention behind each impact on infrastructure.

### Expected behavior

In special cases, like technical debts, functional debts, or accepted risks, a release can lead to release specific, temporary, expected critical or warning states that doesn&apos;t have to be handled or mitigated by the operations team. To decrease unnecessary fire-fighting on both sides, list and explain these scenarios when submitting a deployment standard service request.

### Example for deployment standard service request

**Title**: Deployment of version 1.2.3 to production

**Description**:&lt;br/&gt;
This request is for the deployment of version 1.2.3 of the MyProject application to the production environment.

**Requested Changes**:

- Deployment of version 1.2.3 of the MyProject application
- Update of the following environment variables:
  - Expected environment variable name: `DATABASE_URL`&lt;br/&gt;
    Expected value: `postgresql://user:password@localhost:5432/mydatabase`
  - Expected environment variable name: `API_KEY`&lt;br/&gt;
    Expected value: `abcd1234`
  - Expected environment variable name: `DEBUG`&lt;br/&gt;
    Expected value: `false`
- Special manual steps:
  - **Step 1**: Run the database migration script before starting the application.
  - **Step 2**: Update the DNS records for the new application version.
- Infrastructure changes:
  - Add an additional application server to the load balancer pool.
  - Increase the size of the database server&apos;s disk.
*Expected behavior:
  - There may be a temporary increase in error log entries because of a known issue with the new version that will be fixed in the next release.

**Impact**:&lt;br/&gt;
This deployment will include updates to the application&apos;s database connection and API key, as well as changes to the infrastructure. There is a low risk of downtime during the deployment.

**Rollback Plan**:&lt;br/&gt;
In the event of an issue during the deployment, we will roll back to the previous version of the application and revert any infrastructure changes.

**Testing**:&lt;br/&gt;
This release has been thoroughly tested in the staging environment. A final validation on the production environment to verify that the expected setup changes match the actual state will be performed before the deployment.

**Approvals**:
- Lead developer: approved
- QA team: approved
- Operations team: approved

## Operational guidelines

The following guidelines apply to operating applications or for special failure scenarios that may as well occur during deployment or rollback.

Given the size and complexity of a large applications, which delivers many features with each release, unexpected errors can have multiple potential resolutions. To ensure that the most effective resolution is chosen with minimal disruption to the functionality of a successfully deployed release, implement the following operation guidelines.

### Main workflows

To understand the main and critical workflows in the application, operational guidelines should outline the normal behavior of
important features and workflows at the logical, component, and infrastructure levels.

This forms a general overview of the logic, components, and infrastructure. This overview is necessary for making informed operational decisions and building project-specific operational dashboards, for example—to to identify and highlight project-specific bottlenecks. Also, it&apos;s needed for analyzing, answering, and resolving requests.

### Risks, early warnings, and counter actions

Building a large application is usually coupled with massive application-level logging. In some cases, a critical system issue can be prevented or minimized with timely warning signals. By using regular signals, like logs and metrics, from identified business or technical bottlenecks or risks, the operations team can improve the application&apos;s stability. We recommend maintaining a list of such signals and risks in the operational guidelines. This includes recommended actions to take in order to deliver the best mitigation strategy. For more information on these guidelines, see [Operatable feature guidelines](/docs/dg/dev/best-practices/non-functional-requirement-templates/operatable-feature-guidelines.html).

### Silent undesired scenario

Although monitoring systems are used to detect unwanted states, some business functionality may be within acceptable metrics but not desirable under certain conditions. For example, the minimum daily browsing customer count is 10, but 11 customers during Black Friday is not considered normal. To monitor such cases, these scenarios need to be documented for the operations team.

### User guide

To minimize the impact of resolution efforts and optimize the process, make sure to provide the operations team with the necessary business context. For example, resolving a small number of errors through the Back Office may be more optimal than rolling back an entire release.

### Entity size expectations

The number of entities plays an important role in determining how an application will function in a production environment. To mitigate risks in this area, performance, scaling, manual tests, and reviews can be applied. However, the identified and estimated number of entities for the project can serve as a warning to pay extra attention to these entities in order to further reduce risks. For example, a marketing campaign bringing 10,000 active users to the homepage at 17:08 on Friday.


### Remote service catalog

To properly handle and monitor the cooperation between local and remote or third-party services, provide the operations team with a detailed communication protocol. Make sure to additionally include the expected outages and major impacts. This way, the operations team can ignore expected outages and actively focus on known risks.

For example, a payment provider connected to the project needs to be monitored to ensure its availability. The following communication protocol is used:

- The local service sends an HTTP GET request to the remote service&apos;s API endpoint, along with any necessary headers and query parameters.
- The remote service responds with an HTTP status code and a JSON payload containing the requested data.
- The local service processes the data and displays it to the user or performs any necessary actions.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/process-documentation-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/process-documentation-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Operational and deployment guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.

The following are generic NFRs grouped by quality, acting as a starting point for your project. Be sure to tailor the list to the specific requirements and constraints of your project, and to prioritize and organize the NFRs in a logical manner.


## Non-functional requirements

Non-functional requirements (NFRs) are one of the core tools for architects and developers to describe how the system under development is supposed to work from a technical perspective. Defining NFRs can be as important as defining functional requirements, which are usually done by business, for example—Product Owners. Developing a project without NFRs usually results in
unintended behaviors being discovered late in the product&apos;s lifecycle, which costs a lot of resources to deal with.

Involving all the relevant stakeholders into creating NFRs ensures there is a common understanding of how the system is supposed to work and its key characteristics. The list of stakeholders can include architects, developers, business analysts, and end users.

Using a structured approach to creating NFRs ensures that all relevant NFRs are identified, and that they are prioritized and organized in a logical manner. This can involve using a specific framework or methodology, such as the [ISO 25010 standard](https://iso25000.com/index.php/en/iso-25000-standards/iso-25010), or the Quality Attribute Workshop method, or even [PASSME](https://nick-goupinets.medium.com/passme-muster-846a9997645b).

As the system is being developed, the NFRs may also need to be adjusted to reflect changes in the project&apos;s goals and objectives. Regularly revisiting and updating NFRs ensures that the system continues to meet the technical and functional needs of the business and end users.

## Availability guidelines

Software architecture and design must ensure that there is no negative impact on application availability by following the guidelines:

- Avoid designing the application to limit its own startup and shutdown:
  - Avoid design patterns or coding practices that cause the application to exit unexpectedly in the middle of execution.
  - Avoid using flags or other mechanisms to block the application from starting.
  - Avoid setting limits on the number of concurrent processes that can be run by the application.
- Avoid designing the application to lock shared resources at the application level. For example, if the application uses a database, it shouldn&apos;t lock the database tables or rows that it reads or writes to. This can cause other parts of the system to become unavailable.
- Align resource consumption with expected workloads. For example, if using PHP-FPM, make sure the number of worker processes is sufficient to handle the expected workload without overloading the system.

## Security guidelines

Make sure to define and follow your own project&apos;s [security best practices](/docs/dg/dev/guidelines/security-guidelines.html).

## Deployability guidelines

- The same release candidate and branch must be redeployable without side effects.
- Deploy scripts must not break the behavior of the current system.
  - Deploy script elements must be configured according to your project setup following the [deployment pipeline](/docs/cloud/dev/spryker-cloud-commerce-os/configure-deployment-pipelines/deployment-pipelines.html) process.
  - The application to be deployed (version N+1) must upgrade the data structures and constants and data sets without causing downtime and without failing, losing, or compromising any (version N+1 or N) functionality.
  - The message consumers to be deployed (version N+1) must be backward compatible with the present (&lt;N+1) messages and broker structure.
  - The deployed (version N+1) application *can* clean up obsolete data structures, constants, and data sets if it causes no downtime, unless it&apos;s breaking version N.

## Rollback-ability guidelines

The rollback scripts must not break the behavior of the current system:
- Rollback script elements must be configured according to your project setup following the rollback pipeline process.
- The deployed (version N+1) application can rollback current version (N+1) data structures, constants, and data sets to previous version (N) without causing downtime.

## Performance guidelines

- Zed UI&apos;s average load performance should be under 450ms.
- Glue GET requests with subsequent Zed requests should be under 180ms on average.
- Glue GET requests without subsequent Zed requests should be under 140ms on average.
- Glue POST, PATCH, and PUT requests with subsequent Zed requests should be under 290ms on average.

## Scaleability guidelines

[P&amp;S](/docs/dg/dev/backend-development/data-manipulation/data-publishing/publish-and-synchronization.html) processes must have O(n) time complexity and O(n) resource complexity. In other words, they scale linearly with the number of entities they&apos;re processing. Specifically, memory and CPU consumption must grow proportionally to the number of entities. For example, if a process handles 100 entities, its resource consumption is X Mb. When it handles 200 entities, the resource consumption must not exceed 2X Mb.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/operational-and-deployment-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/operational-and-deployment-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Operational and deployment guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.

The following are generic NFRs grouped by quality, acting as a starting point for your project. Be sure to tailor the list to the specific requirements and constraints of your project, and to prioritize and organize the NFRs in a logical manner.


## Non-functional requirements

Non-functional requirements (NFRs) are one of the core tools for architects and developers to describe how the system under development is supposed to work from a technical perspective. Defining NFRs can be as important as defining functional requirements, which are usually done by business, for example—Product Owners. Developing a project without NFRs usually results in
unintended behaviors being discovered late in the product&apos;s lifecycle, which costs a lot of resources to deal with.

Involving all the relevant stakeholders into creating NFRs ensures there is a common understanding of how the system is supposed to work and its key characteristics. The list of stakeholders can include architects, developers, business analysts, and end users.

Using a structured approach to creating NFRs ensures that all relevant NFRs are identified, and that they are prioritized and organized in a logical manner. This can involve using a specific framework or methodology, such as the [ISO 25010 standard](https://iso25000.com/index.php/en/iso-25000-standards/iso-25010), or the Quality Attribute Workshop method, or even [PASSME](https://nick-goupinets.medium.com/passme-muster-846a9997645b).

As the system is being developed, the NFRs may also need to be adjusted to reflect changes in the project&apos;s goals and objectives. Regularly revisiting and updating NFRs ensures that the system continues to meet the technical and functional needs of the business and end users.

## Availability guidelines

Software architecture and design must ensure that there is no negative impact on application availability by following the guidelines:

- Avoid designing the application to limit its own startup and shutdown:
  - Avoid design patterns or coding practices that cause the application to exit unexpectedly in the middle of execution.
  - Avoid using flags or other mechanisms to block the application from starting.
  - Avoid setting limits on the number of concurrent processes that can be run by the application.
- Avoid designing the application to lock shared resources at the application level. For example, if the application uses a database, it shouldn&apos;t lock the database tables or rows that it reads or writes to. This can cause other parts of the system to become unavailable.
- Align resource consumption with expected workloads. For example, if using PHP-FPM, make sure the number of worker processes is sufficient to handle the expected workload without overloading the system.

## Security guidelines

Make sure to define and follow your own project&apos;s [security best practices](/docs/dg/dev/guidelines/security-guidelines.html).

## Deployability guidelines

- The same release candidate and branch must be redeployable without side effects.
- Deploy scripts must not break the behavior of the current system.
  - Deploy script elements must be configured according to your project setup following the [deployment pipeline](/docs/cloud/dev/spryker-cloud-commerce-os/configure-deployment-pipelines/deployment-pipelines.html) process.
  - The application to be deployed (version N+1) must upgrade the data structures and constants and data sets without causing downtime and without failing, losing, or compromising any (version N+1 or N) functionality.
  - The message consumers to be deployed (version N+1) must be backward compatible with the present (&lt;N+1) messages and broker structure.
  - The deployed (version N+1) application *can* clean up obsolete data structures, constants, and data sets if it causes no downtime, unless it&apos;s breaking version N.

## Rollback-ability guidelines

The rollback scripts must not break the behavior of the current system:
- Rollback script elements must be configured according to your project setup following the rollback pipeline process.
- The deployed (version N+1) application can rollback current version (N+1) data structures, constants, and data sets to previous version (N) without causing downtime.

## Performance guidelines

- Zed UI&apos;s average load performance should be under 450ms.
- Glue GET requests with subsequent Zed requests should be under 180ms on average.
- Glue GET requests without subsequent Zed requests should be under 140ms on average.
- Glue POST, PATCH, and PUT requests with subsequent Zed requests should be under 290ms on average.

## Scaleability guidelines

[P&amp;S](/docs/dg/dev/backend-development/data-manipulation/data-publishing/publish-and-synchronization.html) processes must have O(n) time complexity and O(n) resource complexity. In other words, they scale linearly with the number of entities they&apos;re processing. Specifically, memory and CPU consumption must grow proportionally to the number of entities. For example, if a process handles 100 entities, its resource consumption is X. When it handles 200 entities, the resource consumption must not exceed 2X.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/operational-and-deployment-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/operational-and-deployment-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Operatable feature guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.

By addressing the following items, a development team can ensure that the operations team has the necessary information and resources to maintain the reliability of applications.

## Survivability

An application, during its life cycle, faces various expected and unexpected challenges. To enable the operations team to increase an application&apos;s survivability, it&apos;s recommended to design additional flexible configuration options, like feature or workflow disabling or switching, that can be adjusted on the fly without redeployment to decrease resolution impact on critical business flows. Such options need to be handed over in the operational guidelines.

## Stability

It is very common for business or technical teams to identify project-specific risks that may temporarily challenge the stability of the application.

To enable the operations team to effectively address such events or explore alternative solutions, it&apos;s recommended that any gathered information related to these specific cases are shared via the Operational guidelines. This ensures that the operations team has the necessary information to address stability issues and maintain the reliability of the application.

## Readability

Code readability is a major quality attribute that can impact various aspects of a project, such as the following:
- Code review time
- Code fix time
- Feature delivery time
- Developer onboarding time
- Error evaluation time
- The number of human errors

To improve the efficiency and effectiveness of the team, it&apos;s important to establish a set of readability rules that need to be followed. This ensures that the codebase is easy to understand and maintain, which can lead to faster delivery of features and fewer errors.

## Credibility

To ensure a credible application that can operate continuously, that is 24/7/365, and implement significant changes on a regular basis, it&apos;s recommended to develop and adhere to testing best practices that aim for error-free behavior in the production environment. As an optional step, a set of production-targeted smoke tests, considering their impact on the production environment, can be conducted to verify the proper behavior of recent changes to the system. These tests can be included as part of the operational or deployment guidelines.

{% info_block infoBox %}
It&apos;s recommended to put extra attention over the environment specific application and infrastructure configuration and settings because they carry a higher risk of business impact on error.
{% endinfo_block %}


## Fault-tolerance

We recommend preparing a fallback mechanism for your business critical workflows, like order placement, to make sure that the intentions of your end users are never lost.

## Interruptibility

Scheduled tasks need to be interruptible because they&apos;re more prune to face critical failures and deliberate interruptions if they are always running. Accordingly, they need to leave the processed entities and their related modified entities in a consistent state and not loose any critical business information in between. Special, not-recurring, long-running scheduled tasks need to be marked to be distinguishable from regular scheduled tasks for easy observation and management.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/operatable-feature-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/operatable-feature-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Operatable feature guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.

By addressing the following items, a development team can ensure that the operations team has the necessary information and resources to maintain the reliability of applications.

## Survivability

An application, during its life cycle, faces various expected and unexpected challenges. To enable the operations team to increase an application&apos;s survivability, it&apos;s recommended to design additional flexible configuration options, like feature or workflow disabling or switching, that can be adjusted on the fly without redeployment to decrease resolution impact on critical business flows. Such options need to be handed over in the operational guidelines.

## Stability

It is very common for business or technical teams to identify project-specific risks that may temporarily challenge the stability of the application.

To enable the operations team to effectively address such events or explore alternative solutions, it&apos;s recommended that any gathered information related to these specific cases are shared via the Operational guidelines. This ensures that the operations team has the necessary information to address stability issues and maintain the reliability of the application.

## Readability

Code readability is a major quality attribute that can impact various aspects of a project, such as the following:
- Code review time
- Code fix time
- Feature delivery time
- Developer onboarding time
- Error evaluation time
- The number of human errors

To improve the efficiency and effectiveness of the team, it&apos;s important to establish a set of readability rules that need to be followed. This ensures that the codebase is easy to understand and maintain, which can lead to faster delivery of features and fewer errors.

## Credibility

To ensure a credible application that can operate continuously, that is 24/7/365, and implement significant changes on a regular basis, it&apos;s recommended to develop and adhere to testing best practices that aim for error-free behavior in the production environment. As an optional step, a set of production-targeted smoke tests, considering their impact on the production environment, can be conducted to verify the proper behavior of recent changes to the system. These tests can be included as part of the operational or deployment guidelines.

{% info_block infoBox %}
It&apos;s recommended to put extra attention over the environment specific application and infrastructure configuration and settings because they carry a higher risk of business impact on error.
{% endinfo_block %}


## Fault-tolerance

We recommend preparing a fallback mechanism for your business critical workflows, like order placement, to make sure that the intentions of your end users are never lost.

## Interruptibility

Scheduled tasks need to be interruptible because they&apos;re more prune to face critical failures and deliberate interruptions if they are always running. Accordingly, they need to leave the processed entities and their related modified entities in a consistent state and not loose any critical business information in between. Special, not-recurring, long-running scheduled tasks need to be marked to be distinguishable from regular scheduled tasks for easy observation and management.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/operatable-feature-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/operatable-feature-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Monitorable process guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.


Enable your Operations Team to track and correlate issues within deployed applications by implementing the following practices:
- Ensure comprehensive logging mechanisms for capturing relevant events and errors.
- Implement metric generation techniques to gather key health indicators.

These practices provide essential data for troubleshooting and monitoring application health.

## Log generation

Applies to all application components.

### Log entry best practices

- Unified format: The format and text taxonomy of log entries must be unified across all log providers for ease of human processing.
- No PII: Log entries, under no circumstances, can contain Personal Identifiable Information (PII) for security reasons.
- No encryption keys or secrets: Log entries must not contain any encryption keys or secrets.
- Single event reflection: To ensure determinability, each log entry must reflect a single event and the other way around.
- Language use: Log entries must use simple English language or widely recognized characters, especially when representing complex data.
- Meaningful messages: Log entry messages must be meaningful and provide context to the event. For example, avoid vague messages like &quot;Error occurred&quot;.
- State preservation: When creating log entries, avoid passing arguments to log statements that could alter the state of an object. This is crucial for traceability and readability.
- Cross-component tracing ID: Include a cross component tracing ID in log entries to enable tracking of all generated logs across multiple components.
- Data residency compliance: Ensure that logs comply with data residency requirements.

### What to log

- Requests: Incoming requests to a local component.
- Remote calls: All outgoing requests to a remote service. Log the duration of the call and the response, such as success or error, for future debugging.
- Scheduled tasks: All initiated scheduled tasks with their end results: error, success, interrupt.
- Application scoped resource issues:
  - Exhausted resources
  - Exceeded capacities
  - Session management failures
  - Connectivity issues
- Threats: Suspicious or malicious activities against the application, as well as successes and failures in authentication or authorization.
- Exceptions:
  - Handled and unhandled application errors
  - Stack traces
  - Troubleshooting instances
  - Thrown exceptions
- Silenced exceptions: Instances of an exception being consumed by an empty `catch()` clause.
- Significant user actions and events:
  - Help requests
  - Cancelled actions
- Notable user actions:
  - Successful logins
  - Privilege elevations
  - Data validation failures
  - Payment and transaction events
  - Significant user journey events

### What not to log

- Unreasonable logging: Avoid logging without a clear purpose. When deciding to create a log entry, identify at least one use case for the data.
- Performance critical places: Minimize logging in areas where performance is critical. If there&apos;s a performance-critical process or a large cycle as a sub-process element, try to strike a balance between performance and traceability.
- Audit trail: While it&apos;s recommended to log the audit trails of significant entity changes, these logs shouldn&apos;t be sent to the regular log system because of the sensitive nature of the data typically involved in authentication and authorization.

### Log levels

Appropriately implement the following log levels in application workflows to simplify issue investigations and resolutions. The log levels are based on Syslog [RFC 5424](https://datatracker.ietf.org/doc/html/rfc5424).

| Level | Description |
|-------|-------------|
| Debug | Provides detailed data that&apos;s mostly used for debugging. These logs allow to check variable values and/or error stacks. |
| Info |  Provides information about the normal operation of the application. This level is often used to record the progress of a task or operation. |
| Notice | Provides information about normal, but significant, events that occur within the application. |
| Warning | Describes events that are less destructive than errors. They usually don&apos;t result in any reduction of the system&apos;s functionality or its full failure. Undesirable things that are not necessarily wrong. |
| Error | Identifies error events that may still let the software run but with restricted capabilities in the impacted routes. |
| Critical | Identifies extremely serious error events that are likely to cause the system to abort. Typically, this leads to catastrophic failures. |
| Alert | Indicates a situation that requires immediate attention. |
| Emergency | Indicates a severe problem that requires immediate action to prevent damage or loss. |

### Log entry format

A log entry must always answer the following items and follow the describes structure:
- *who* caused an event.
- *when* exactly did the event happen.
- *where* did the event take place, for example-context, component or application.
- *what* happened and/or why it happened.
- *result* of event: exception, success details, information details.

The following are examples of log structure. When designing your own log structure, take into account recommendations from [CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-formats-json.html) and  [Cloud Handler](https://github.com/maxbanton/cwh).

&lt;details&gt;
  &lt;summary&gt;Log structure example&lt;/summary&gt;

```JSON
{
  &quot;actor&quot;: {
      &quot;actorId&quot;: &quot;end-user-1&quot;,
      &quot;sessionId&quot;: &quot;end-user-1-session-27&quot;,
      &quot;transactionId&quot;: &quot;end-to-end-transaction-555&quot;,
      &quot;parentTransactionId&quot;: &quot;end-to-end-transaction-554&quot;,
  },
  &quot;service&quot;: {
    &quot;host&quot;: &quot;ip-11-111-1-111.eu-central-1.compute.internal&quot;,
    &quot;componentType&quot;: &quot;GLUE&quot;,
    &quot;component&quot;: &quot;StorefrontApi&quot;,
    &quot;activityId&quot;: &quot;address-search-suggestions&quot;,
  },
  &quot;@timestamp&quot;: &quot;2022-08-01T18:20:22.602934+00:00&quot;,
  &quot;message&quot;:&quot;StorefrontAPI : GET : v2/stores/delivery : start&quot;,
  &quot;messageId&quot;:&quot;unique-message-id&quot;,
  &quot;level&quot;: 0,
  &quot;levelCode&quot;: 0,
  &quot;extra&quot; : {
     &quot;exception&quot;: {...}
     &quot;environment&quot;: {
            &quot;application&quot;: &quot;&quot;,
            &quot;environment&quot;: &quot;&quot;,
            &quot;store&quot;: &quot;&quot;,
            &quot;codeBucket&quot;: &quot;&quot;,
            &quot;locale&quot;: &quot;&quot;
     },
     &quot;server&quot;: {
            &quot;url&quot;: &quot;&quot;,
            &quot;isHttps&quot;: true,
            &quot;hostname&quot;: &quot;&quot;,
            &quot;requestMethod&quot;: &quot;&quot;,
            &quot;referer&quot;: null       
     },
    &quot;request&quot;: {
            &quot;requestId&quot;: &quot;&quot;,
            &quot;type&quot;: &quot;&quot;,
            &quot;requestParams&quot;: {}
    },
    &quot;externalRequest&quot; : {
      &quot;externalDuration&quot;:&quot;0&quot;,
      &quot;externalResponseCode&quot;: &quot;remote-service-unique-answer-code&quot;
    },
}
```

&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Log structure with example values&lt;/summary&gt;

```JSON
{
    &quot;@timestamp&quot;: &quot;2022-08-01T18:20:22.602934+00:00&quot;,
    &quot;@version&quot;: 1,
    &quot;host&quot;: &quot;ip-10-105-6-175.eu-central-1.compute.internal&quot;,
    &quot;message&quot;: &quot;StorefrontAPI : Request : v2/stores/delivery&quot;,
    &quot;type&quot;: &quot;GLUE&quot;,
    &quot;channel&quot;: &quot;Glue&quot;,
    &quot;level&quot;: &quot;INFO&quot;,
    &quot;monolog_level&quot;: 200,
    &quot;extra&quot;: {
        &quot;environment&quot;: {
            &quot;application&quot;: &quot;GLUE&quot;,
            &quot;environment&quot;: &quot;docker.dev&quot;,
            &quot;store&quot;: null,
            &quot;codeBucket&quot;: &quot;US&quot;,
            &quot;locale&quot;: &quot;en_US&quot;
        },
        &quot;server&quot;: {
            &quot;url&quot;: &quot;https://api.com/v1/action-name?param1=abc&quot;,
            &quot;is_https&quot;: true,
            &quot;hostname&quot;: &quot;api.com&quot;,
            &quot;user_agent&quot;: &quot;cypress/test-automation&quot;,
            &quot;user_ip&quot;: &quot;35.205.30.220&quot;,
            &quot;request_method&quot;: &quot;GET&quot;,
            &quot;referer&quot;: null
        },
        &quot;request&quot;: {
            &quot;requestId&quot;: &quot;3c1f60f1&quot;,
            &quot;type&quot;: &quot;WEB&quot;,
            &quot;request_params&quot;: {
                &quot;currency&quot;: &quot;USD&quot;,
                &quot;service_type&quot;: &quot;delivery&quot;,
                &quot;zip_code&quot;: &quot;32773-5600&quot;,
                &quot;address&quot;: &quot;3707 S Orlando Dr&quot;
            }
        }
    },
    &quot;context&quot;: {
        &quot;payload&quot;: {
            &quot;find_by&quot;: []
        }
    }
}
```

&lt;/details&gt;


&lt;details&gt;
  &lt;summary&gt;Log structure with example error values&lt;/summary&gt;

```JSON
{
  &quot;@timestamp&quot;: &quot;2021-08-19T14:54:23.447685+00:00&quot;,
  &quot;@version&quot;: 1,
  &quot;host&quot;: &quot;localhost&quot;,
  &quot;message&quot;: &quot;Exception - Sniffer run was not successful: Unknown error in \&quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/ArchitectureSniffer/ArchitectureSniffer.php::165\&quot;&quot;,
  &quot;type&quot;: &quot;ZED&quot;,
  &quot;channel&quot;: &quot;Zed&quot;,
  &quot;level&quot;: &quot;CRITICAL&quot;,
  &quot;monolog_level&quot;: 500,
  &quot;extra&quot;: {
    &quot;environment&quot;: {
      &quot;application&quot;: &quot;ZED&quot;,
      &quot;environment&quot;: &quot;development&quot;,
      &quot;store&quot;: &quot;US&quot;,
      &quot;codeBucket&quot;: &quot;US&quot;,
      &quot;locale&quot;: &quot;en_US&quot;
    },
    &quot;server&quot;: {
      &quot;url&quot;: &quot;http://:/&quot;,
      &quot;is_https&quot;: false,
      &quot;hostname&quot;: &quot;&quot;,
      &quot;user_agent&quot;: null,
      &quot;user_ip&quot;: null,
      &quot;request_method&quot;: &quot;cli&quot;,
      &quot;referer&quot;: null
    },
    &quot;request&quot;: {
      &quot;requestId&quot;: &quot;ad26d9e1&quot;,
      &quot;type&quot;: &quot;CLI&quot;,
      &quot;request_params&quot;: []
    }
  },
  &quot;context&quot;: {
    &quot;exception&quot;: {
      &quot;class&quot;: &quot;Exception&quot;,
      &quot;message&quot;: &quot;Sniffer run was not successful: Unknown error&quot;,
      &quot;code&quot;: 0,
      &quot;file&quot;: &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/ArchitectureSniffer/ArchitectureSniffer.php:165&quot;,
      &quot;trace&quot;: [
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/ArchitectureSniffer/ArchitectureSniffer.php:117&quot;,
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/DevelopmentFacade.php:484&quot;,
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Communication/Console/CodeArchitectureSnifferConsole.php:286&quot;,
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Communication/Console/CodeArchitectureSnifferConsole.php:93&quot;,
        &quot;/.../vendor/symfony/console/Command/Command.php:258&quot;,
        &quot;/.../vendor/symfony/console/Application.php:938&quot;,
        &quot;/.../vendor/symfony/console/Application.php:266&quot;,
        &quot;/.../vendor/spryker/console/src/Spryker/Zed/Console/Communication/Bootstrap/ConsoleBootstrap.php:111&quot;,
        &quot;/.../vendor/symfony/console/Application.php:142&quot;,
        &quot;/.../vendor/spryker/console/bin/console:27&quot;      
      ]
    }
  }
}
```

&lt;/details&gt;

## Metric generation

Each metric represents a condition of system attributes. There can be many of them, and they can be correlated with each other.

- Every service or component can define and generate project-appropriate metrics for key processes to enable tracking of such events and reacting when they reach undesired scores. These metrics are generated with a basic dimension of the duration and outcome of the operation, such as success or failure.
  - The start and end of a process must be recorded to enable tracking and tuning of the infrastructure.
  - Instances of communication duration with remote services must be recorded to understand if a local process is delayed for a good reason.
- Critical metrics, along with their threshold values, must be highlighted in the [Operational guidelines](/docs/dg/dev/architecture/non-functional-requirement-templates/process-documentation-guidelines.html#operational-guidelines) to enable the setting up of a monitoring system.
- Deployment and rollback flows can generate metrics to enable tracking and interaction with these processes.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/monitorable-process-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/monitorable-process-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Monitorable process guidelines</title>
            <description>This document provides guideline templates for development teams striving for high-quality software. These templates are flexible and serve as a starting point, so make sure to adjust them to your project&apos;s requirements. Defining and following these guidelines may be necessary to fulfill project Service Level Agreements (SLAs), with each guideline explicitly outlining the responsible team. Alignment with all involved teams is essential for ensuring a functioning concept.


Enable your Operations Team to track and correlate issues within deployed applications by implementing the following practices:
- Ensure comprehensive logging mechanisms for capturing relevant events and errors.
- Implement metric generation techniques to gather key health indicators.

These practices provide essential data for troubleshooting and monitoring application health.

## Log generation

Applies to all application components.

### Log entry best practices

- Unified format: The format and text taxonomy of log entries must be unified across all log providers for ease of human processing.
- No PII: Log entries, under no circumstances, can contain Personal Identifiable Information (PII) for security reasons.
- No encryption keys or secrets: Log entries must not contain any encryption keys or secrets.
- Single event reflection: To ensure determinability, each log entry must reflect a single event and the other way around.
- Language use: Log entries must use simple English language or widely recognized characters, especially when representing complex data.
- Meaningful messages: Log entry messages must be meaningful and provide context to the event. For example, avoid vague messages like &quot;Error occurred&quot;.
- State preservation: When creating log entries, avoid passing arguments to log statements that could alter the state of an object. This is crucial for traceability and readability.
- Cross-component tracing ID: Include a cross component tracing ID in log entries to enable tracking of all generated logs across multiple components.
- Data residency compliance: Ensure that logs comply with data residency requirements.

### What to log

- Requests: Incoming requests to a local component.
- Remote calls: All outgoing requests to a remote service. Log the duration of the call and the response, such as success or error, for future debugging.
- Scheduled tasks: All initiated scheduled tasks with their end results: error, success, interrupt.
- Application scoped resource issues:
  - Exhausted resources
  - Exceeded capacities
  - Session management failures
  - Connectivity issues
- Threats: Suspicious or malicious activities against the application, as well as successes and failures in authentication or authorization.
- Exceptions:
  - Handled and unhandled application errors
  - Stack traces
  - Troubleshooting instances
  - Thrown exceptions
- Silenced exceptions: Instances of an exception being consumed by an empty `catch()` clause.
- Significant user actions and events:
  - Help requests
  - Cancelled actions
- Notable user actions:
  - Successful logins
  - Privilege elevations
  - Data validation failures
  - Payment and transaction events
  - Significant user journey events

### What not to log

- Unreasonable logging: Avoid logging without a clear purpose. When deciding to create a log entry, identify at least one use case for the data.
- Performance critical places: Minimize logging in areas where performance is critical. If there&apos;s a performance-critical process or a large cycle as a sub-process element, try to strike a balance between performance and traceability.
- Audit trail: While it&apos;s recommended to log the audit trails of significant entity changes, these logs shouldn&apos;t be sent to the regular log system because of the sensitive nature of the data typically involved in authentication and authorization.

### Log levels

Appropriately implement the following log levels in application workflows to simplify issue investigations and resolutions. The log levels are based on Syslog [RFC 5424](https://datatracker.ietf.org/doc/html/rfc5424).

| Level | Description |
|-------|-------------|
| Debug | Provides detailed data that&apos;s mostly used for debugging. These logs allow to check variable values and/or error stacks. |
| Info |  Provides information about the normal operation of the application. This level is often used to record the progress of a task or operation. |
| Notice | Provides information about normal, but significant, events that occur within the application. |
| Warning | Describes events that are less destructive than errors. They usually don&apos;t result in any reduction of the system&apos;s functionality or its full failure. Undesirable things that are not necessarily wrong. |
| Error | Identifies error events that may still let the software run but with restricted capabilities in the impacted routes. |
| Critical | Identifies extremely serious error events that are likely to cause the system to abort. Typically, this leads to catastrophic failures. |
| Alert | Indicates a situation that requires immediate attention. |
| Emergency | Indicates a severe problem that requires immediate action to prevent damage or loss. |

### Log entry format

A log entry must always answer the following items and follow the describes structure:
- *who* caused an event.
- *when* exactly did the event happen.
- *where* did the event take place, for example-context, component or application.
- *what* happened and/or why it happened.
- *result* of event: exception, success details, information details.

The following are examples of log structure. When designing your own log structure, take into account recommendations from [CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-formats-json.html) and  [Cloud Handler](https://github.com/maxbanton/cwh).

&lt;details&gt;
  &lt;summary&gt;Log structure example&lt;/summary&gt;

```JSON
{
  &quot;actor&quot;: {
      &quot;actorId&quot;: &quot;end-user-1&quot;,
      &quot;sessionId&quot;: &quot;end-user-1-session-27&quot;,
      &quot;transactionId&quot;: &quot;end-to-end-transaction-555&quot;,
      &quot;parentTransactionId&quot;: &quot;end-to-end-transaction-554&quot;,
  },
  &quot;service&quot;: {
    &quot;host&quot;: &quot;ip-11-111-1-111.eu-central-1.compute.internal&quot;,
    &quot;componentType&quot;: &quot;GLUE&quot;,
    &quot;component&quot;: &quot;StorefrontApi&quot;,
    &quot;activityId&quot;: &quot;address-search-suggestions&quot;,
  },
  &quot;@timestamp&quot;: &quot;2022-08-01T18:20:22.602934+00:00&quot;,
  &quot;message&quot;:&quot;StorefrontAPI : GET : v2/stores/delivery : start&quot;,
  &quot;messageId&quot;:&quot;unique-message-id&quot;,
  &quot;level&quot;: 0,
  &quot;levelCode&quot;: 0,
  &quot;extra&quot; : {
     &quot;exception&quot;: {...}
     &quot;environment&quot;: {
            &quot;application&quot;: &quot;&quot;,
            &quot;environment&quot;: &quot;&quot;,
            &quot;store&quot;: &quot;&quot;,
            &quot;codeBucket&quot;: &quot;&quot;,
            &quot;locale&quot;: &quot;&quot;
     },
     &quot;server&quot;: {
            &quot;url&quot;: &quot;&quot;,
            &quot;isHttps&quot;: true,
            &quot;hostname&quot;: &quot;&quot;,
            &quot;requestMethod&quot;: &quot;&quot;,
            &quot;referer&quot;: null       
     },
    &quot;request&quot;: {
            &quot;requestId&quot;: &quot;&quot;,
            &quot;type&quot;: &quot;&quot;,
            &quot;requestParams&quot;: {}
    },
    &quot;externalRequest&quot; : {
      &quot;externalDuration&quot;:&quot;0&quot;,
      &quot;externalResponseCode&quot;: &quot;remote-service-unique-answer-code&quot;
    },
}
```

&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Log structure with example values&lt;/summary&gt;

```JSON
{
    &quot;@timestamp&quot;: &quot;2022-08-01T18:20:22.602934+00:00&quot;,
    &quot;@version&quot;: 1,
    &quot;host&quot;: &quot;ip-10-105-6-175.eu-central-1.compute.internal&quot;,
    &quot;message&quot;: &quot;StorefrontAPI : Request : v2/stores/delivery&quot;,
    &quot;type&quot;: &quot;GLUE&quot;,
    &quot;channel&quot;: &quot;Glue&quot;,
    &quot;level&quot;: &quot;INFO&quot;,
    &quot;monolog_level&quot;: 200,
    &quot;extra&quot;: {
        &quot;environment&quot;: {
            &quot;application&quot;: &quot;GLUE&quot;,
            &quot;environment&quot;: &quot;docker.dev&quot;,
            &quot;store&quot;: null,
            &quot;codeBucket&quot;: &quot;US&quot;,
            &quot;locale&quot;: &quot;en_US&quot;
        },
        &quot;server&quot;: {
            &quot;url&quot;: &quot;https://api.com/v1/action-name?param1=abc&quot;,
            &quot;is_https&quot;: true,
            &quot;hostname&quot;: &quot;api.com&quot;,
            &quot;user_agent&quot;: &quot;cypress/test-automation&quot;,
            &quot;user_ip&quot;: &quot;35.205.30.220&quot;,
            &quot;request_method&quot;: &quot;GET&quot;,
            &quot;referer&quot;: null
        },
        &quot;request&quot;: {
            &quot;requestId&quot;: &quot;3c1f60f1&quot;,
            &quot;type&quot;: &quot;WEB&quot;,
            &quot;request_params&quot;: {
                &quot;currency&quot;: &quot;USD&quot;,
                &quot;service_type&quot;: &quot;delivery&quot;,
                &quot;zip_code&quot;: &quot;32773-5600&quot;,
                &quot;address&quot;: &quot;3707 S Orlando Dr&quot;
            }
        }
    },
    &quot;context&quot;: {
        &quot;payload&quot;: {
            &quot;find_by&quot;: []
        }
    }
}
```

&lt;/details&gt;


&lt;details&gt;
  &lt;summary&gt;Log structure with example error values&lt;/summary&gt;

```JSON
{
  &quot;@timestamp&quot;: &quot;2021-08-19T14:54:23.447685+00:00&quot;,
  &quot;@version&quot;: 1,
  &quot;host&quot;: &quot;localhost&quot;,
  &quot;message&quot;: &quot;Exception - Sniffer run was not successful: Unknown error in \&quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/ArchitectureSniffer/ArchitectureSniffer.php::165\&quot;&quot;,
  &quot;type&quot;: &quot;ZED&quot;,
  &quot;channel&quot;: &quot;Zed&quot;,
  &quot;level&quot;: &quot;CRITICAL&quot;,
  &quot;monolog_level&quot;: 500,
  &quot;extra&quot;: {
    &quot;environment&quot;: {
      &quot;application&quot;: &quot;ZED&quot;,
      &quot;environment&quot;: &quot;development&quot;,
      &quot;store&quot;: &quot;US&quot;,
      &quot;codeBucket&quot;: &quot;US&quot;,
      &quot;locale&quot;: &quot;en_US&quot;
    },
    &quot;server&quot;: {
      &quot;url&quot;: &quot;http://:/&quot;,
      &quot;is_https&quot;: false,
      &quot;hostname&quot;: &quot;&quot;,
      &quot;user_agent&quot;: null,
      &quot;user_ip&quot;: null,
      &quot;request_method&quot;: &quot;cli&quot;,
      &quot;referer&quot;: null
    },
    &quot;request&quot;: {
      &quot;requestId&quot;: &quot;ad26d9e1&quot;,
      &quot;type&quot;: &quot;CLI&quot;,
      &quot;request_params&quot;: []
    }
  },
  &quot;context&quot;: {
    &quot;exception&quot;: {
      &quot;class&quot;: &quot;Exception&quot;,
      &quot;message&quot;: &quot;Sniffer run was not successful: Unknown error&quot;,
      &quot;code&quot;: 0,
      &quot;file&quot;: &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/ArchitectureSniffer/ArchitectureSniffer.php:165&quot;,
      &quot;trace&quot;: [
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/ArchitectureSniffer/ArchitectureSniffer.php:117&quot;,
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Business/DevelopmentFacade.php:484&quot;,
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Communication/Console/CodeArchitectureSnifferConsole.php:286&quot;,
        &quot;/.../vendor/spryker/development/src/Spryker/Zed/Development/Communication/Console/CodeArchitectureSnifferConsole.php:93&quot;,
        &quot;/.../vendor/symfony/console/Command/Command.php:258&quot;,
        &quot;/.../vendor/symfony/console/Application.php:938&quot;,
        &quot;/.../vendor/symfony/console/Application.php:266&quot;,
        &quot;/.../vendor/spryker/console/src/Spryker/Zed/Console/Communication/Bootstrap/ConsoleBootstrap.php:111&quot;,
        &quot;/.../vendor/symfony/console/Application.php:142&quot;,
        &quot;/.../vendor/spryker/console/bin/console:27&quot;      
      ]
    }
  }
}
```

&lt;/details&gt;

## Metric generation

Each metric represents a condition of system attributes. There can be many of them, and they can be correlated with each other.

- Every service or component can define and generate project-appropriate metrics for key processes to enable tracking of such events and reacting when they reach undesired scores. These metrics are generated with a basic dimension of the duration and outcome of the operation, such as success or failure.
  - The start and end of a process must be recorded to enable tracking and tuning of the infrastructure.
  - Instances of communication duration with remote services must be recorded to understand if a local process is delayed for a good reason.
- Critical metrics, along with their threshold values, must be highlighted in the [Operational guidelines](/docs/dg/dev/best-practices/non-functional-requirement-templates/process-documentation-guidelines.html#operational-guidelines) to enable the setting up of a monitoring system.
- Deployment and rollback flows can generate metrics to enable tracking and interaction with these processes.
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/monitorable-process-guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/architecture/non-functional-requirement-templates/non-functional-requirement-templates/monitorable-process-guidelines.html</guid>
            
            
        </item>
        
        <item>
            <title>Basic SEO techniques to use in your project</title>
            <description>&lt;p&gt;Search Engine Optimization or SEO is the process of improving a site to increase its visibility for relevant searches. The better visibility a page has in search results, the more likely you are to garner attention and attract prospective and existing customers to your business.&lt;/p&gt;
&lt;p&gt;Search engines use bots to crawl pages on the web, going from site to site, collecting information about those pages, and putting them in an index. Next, algorithms analyze pages in the index, taking into account a lot of ranking factors, to determine the order pages should appear in the search results for a given query.&lt;/p&gt;
&lt;p&gt;To increase search result ranking in the Spryker system, we use some basic SEO approaches. To utilize them in your project, first of all, you need to define the landing pages, which will collect the basic traffic and should be indexed first. By default, in the Spryker system, these landing pages are &lt;em&gt;Product details&lt;/em&gt;, &lt;em&gt;Catalog&lt;/em&gt;, &lt;em&gt;Shared Shopping List&lt;/em&gt;, and &lt;em&gt;Product bundle&lt;/em&gt; pages.&lt;/p&gt;
&lt;p&gt;The simplest and basic way to optimize SEO of page content is the proper usage of headings on the pages and microdata usage.&lt;/p&gt;
&lt;h2 id=&quot;using-headings&quot;&gt;Using headings&lt;/h2&gt;
&lt;p&gt;Headings allow for easy navigation through page content and help users and search engines read and understand the text. However, for the headings to be helpful for users and search engines, the headings must be structured well, and contain the key phrases.&lt;/p&gt;
&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;H1 headings&lt;/div&gt;
&lt;p&gt;It is important to use the &lt;code&gt;h1&lt;/code&gt; heading. However, the number of &lt;code&gt;h1&lt;/code&gt; elements on each page must be limited to one. The &lt;code&gt;h1&lt;/code&gt; heading must be the name or title of the page.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;p&gt;For example, on a catalog page, &lt;code&gt;h1&lt;/code&gt; is the name of the chosen category. Or, on a product details page, it’s the product name.
Then &lt;code&gt;h2&lt;/code&gt; and &lt;code&gt;h3&lt;/code&gt; subheadings are used to introduce different sections. Those individual sections might also use more specific headers (&lt;code&gt;h3&lt;/code&gt; tags, then &lt;code&gt;h4&lt;/code&gt; tags) to introduce sub-sections. It’s rare for most content to get deep enough to need to use h4 tags.&lt;/p&gt;
&lt;p&gt;Check out the headings structure on a catalog page in the Spryker Demo Shop:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/Developer+Guide/Applying+basic+SEO+approaches+to+your+project/catalog-page.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To keep the initial Spryker design, we use the service CSS classes title with modifiers h1-h6. At the same time, headings in CMS blocks are div elements, as these blocks can be injected anywhere and potentially could break the common heading structure.&lt;/p&gt;
&lt;h2 id=&quot;using-microdata&quot;&gt;Using microdata&lt;/h2&gt;
&lt;p&gt;After introducing the headings structure, the next step towards increasing the search result ranking is using the microdata. There are different approaches to using microdata on a page, and one of them is the usage of the &lt;a href=&quot;https://schema.org/&quot;&gt;Schema.org&lt;/a&gt; vocabulary, which we also implemented for the Spryker system. &lt;a href=&quot;https://schema.org/&quot;&gt;Schema.org&lt;/a&gt; (often called Schema) is a semantic vocabulary of tags or microdata that you can add to your HTML to improve the way search engines read and represent your page on search engine results pages (SERPs). Microdata is one of three code languages designed to provide search-engine spider programs with information about the website content. The failure to use microdata leads to the reduction of search ranks of the shop pages. Because the content is not typed for search engines in this case, and they can not build structured pages to index them well.&lt;/p&gt;
&lt;p&gt;Integrating microdata into code offers a number of potential advantages. First, microdata can give search engine crawlers more context for the type of information on a website and the way the site should be indexed and ranked. Another benefit of microdata is the creation of &lt;em&gt;rich snippets&lt;/em&gt;, which display more information on the SERPs than traditional listings.&lt;/p&gt;
&lt;p&gt;Considering that Spryker is an e-commerce platform, the most important types of information are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Product: any offered product or service&lt;/li&gt;
&lt;li&gt;Offer: an offer to transfer some rights to an item or to provide a service&lt;/li&gt;
&lt;li&gt;Review: a review of an item&lt;/li&gt;
&lt;li&gt;AggregateRating: the average rating based on multiple ratings or reviews&lt;/li&gt;
&lt;li&gt;PropertyValue: a property-value pair represents a feature of a product or place&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example of the &lt;a href=&quot;https://schema.org/&quot;&gt;Schema.org&lt;/a&gt; microdata implementation for a page:&lt;/p&gt;
&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;itemscope&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;itemtype=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://schema.org/Product&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;itemprop=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Product name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;  
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;itemscope&lt;/code&gt; element in an HTML tag encloses information about the item. The &lt;code&gt;itemscope&lt;/code&gt; specifies that the HTML contained in the tag is about a particular item. To specify the type of the item, we use the itemtype attribute right after the &lt;code&gt;itemscope&lt;/code&gt;. For example, on the following Spryker Product details page, the &lt;code&gt;itemtype&lt;/code&gt; attribute specifies that the item contained in the tag has the Product type, as defined in the &lt;a href=&quot;https://schema.org/&quot;&gt;schema.org&lt;/a&gt; type hierarchy. Item types are provided as URLs, in our case &lt;code&gt;http://schema.org/Product&lt;/code&gt;. To label properties of items, we use the itemprop attribute:&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Name, image, and product wrapper&lt;/summary&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/Developer+Guide/Applying+basic+SEO+approaches+to+your+project/name-image-product-wrapper.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
 &lt;/details&gt;
&lt;details&gt;
 &lt;summary&gt;Brand,  SKU, offer, and price&lt;/summary&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/Developer+Guide/Applying+basic+SEO+approaches+to+your+project/brand-sku-offer-price.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Description, product details, ratings&lt;/summary&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/Developer+Guide/Applying+basic+SEO+approaches+to+your+project/description-product-details-ratings.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
 &lt;/details&gt;
&lt;details&gt;
 &lt;summary&gt;Review&lt;/summary&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/Developer+Guide/Applying+basic+SEO+approaches+to+your+project/review.png.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
 &lt;/details&gt;
&lt;h2 id=&quot;applying-the-basic-seo-techniques-in-your-project&quot;&gt;Applying the basic SEO techniques in your project&lt;/h2&gt;
&lt;p&gt;For details about applying the basic SEO techniques in your project, see &lt;a href=&quot;/docs/dg/dev/integrate-and-configure/integrate-basic-seo-techniques.html&quot;&gt;Basic SEO techniques integration guide&lt;/a&gt;.&lt;/p&gt;
</description>
            <pubDate>Tue, 21 Apr 2026 09:51:53 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/frontend-development/latest/yves/basic-seo-techniques-to-use-in-your-project.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/frontend-development/latest/yves/basic-seo-techniques-to-use-in-your-project.html</guid>
            
            
        </item>
        
        <item>
            <title>Guidelines</title>
            <description>This section contains a collection of useful guidelines for developing on the Spryker Commerce OS:  

- [Coding guidelines](/docs/dg/dev/guidelines/coding-guidelines/coding-guidelines.html)
- [Keeping a project upgradable](/docs/dg/dev/guidelines/keeping-a-project-upgradable/keeping-a-project-upgradable.html)
- [Performance guidelines](/docs/dg/dev/guidelines/performance-guidelines/general-performance-guidelines.html)
- [Testing guidelines](/docs/dg/dev/guidelines/testing-guidelines/testing-best-practices/testing-concepts.html)
- [Project development guidelines](/docs/dg/dev/guidelines/project-development-guidelines.html)
- [Data processing guidelines](/docs/dg/dev/guidelines/data-processing-guidelines.html)
- [Module configuration convention](/docs/dg/dev/guidelines/module-configuration-convention.html)
- [Security guidelines](/docs/dg/dev/guidelines/security-guidelines.html)
</description>
            <pubDate>Tue, 21 Apr 2026 09:11:56 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/guidelines/guidelines.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/guidelines/guidelines.html</guid>
            
            
        </item>
        
    </channel>
</rss>
