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

Log enrichment and/or inserted properties #5929

Closed
jstafford5380 opened this issue Feb 9, 2021 · 9 comments · Fixed by #6662
Closed

Log enrichment and/or inserted properties #5929

jstafford5380 opened this issue Feb 9, 2021 · 9 comments · Fixed by #6662
Assignees
Labels
api: logging Issues related to the Cloud Logging API. needs more info This issue needs more information from the customer to proceed. priority: p3 Desirable enhancement or fix. May not be included in next release. type: feature request ‘Nice-to-have’ improvement, new feature or different behavior or design.

Comments

@jstafford5380
Copy link

Describe the solution you'd like
Serilog is a pretty popular logger and it has the ability to enrich logs. It does this by decomposing objects into a list of properties that can be made available to the log output both as interpolated values but also as a list of properties which I believe are format_parameters in the stackdriver schema. I think right now, scalar properties get added as format_parameters, but objects only get serialized to json, but the properties of those objects are not added as queryable properties in the collection.

It would be useful to have something similar to serilog in thsi respect, as part of this package, or at least some means to write extension packages to achieve this. I think this could be achieved by introducing some sort of middleware pipeline that can be added to configuration. This middleware (or chain of middlewares) would run on every log statement and allow a developer to insert additional properties to each log. I believe the way this is achieved in serilog is to make available, a collection of properties that can be accessed in the middleware, allowing the developer to read from and add to the collection that would ultimately be mapped into format_parameters

Describe alternatives you've considered
I considered simply adding the desired properties to the actual log statement, but this approach is a bit more obtrusive.

Additional context
None.

@jskeet
Copy link
Collaborator

jskeet commented Feb 9, 2021

I'll assign this to Amanda for more comment, but I don't expect this to happen. If you want something like Serilog, I'd suggest using Serilog with its Stackdriver integration.

In the future I expect our diagnostics integration to be slimmer rather than more involved - I'm hoping that when https://github.com/googleapis/google-cloud-dotnet/tree/master/apis/Google.Cloud.Logging.Console is ready, that would be the simplest integration point, with Stackdriver just collecting log entries from the console.

Designing our own fully-featured competitor to Serilog is something that I don't personally think we should invest time in.

@jskeet jskeet added the type: feature request ‘Nice-to-have’ improvement, new feature or different behavior or design. label Feb 9, 2021
@jstafford5380
Copy link
Author

Designing our own fully-featured competitor to Serilog is something that I don't personally think we should invest time in.

I tend to agree. I was really just looking for something in between. This package has the log schema, and I'm really just looking for a way to insert into that log schema rather than having to implement a completely new integration. Serilog doesn't have a 1st class Cloud Logging sink, it's maintained by a random community member.

@amanda-tarafa
Copy link
Contributor

There's another alternative that you can use, and that is to use directly ILogger.Log<TState>(LogLevel, EventId, TState, Exception, Func<TState, Exception, string>) instead of the helper ILogger extension methods. If TState is the same as what Microsoft.Extensions.Logging.LoggerExtensions would send the "true" format parameters as, we add all pairs as format_parameters (the string representation of the value). You could even write your own extension for ILogger that would take parameters that would differentiate between "true" format parameters and extra properties you want to add, as long as they end up in TState, we will add them.

And another type of extra info you can add to the log entries is labels. We have Google.Cloud.Diagnostics.ILogEntryLabelProvider that you can implement (as many as you'd like) and register through standard DI. Take a look at #5313 which is an open FR around allowing labels per log entry (right now there's not an easy way for label providers to get context describing the log entry, so these work better when you want to add the same label to all entries, or context is not dependent on the entry itself but on something else).

@jstafford5380
Copy link
Author

Just leaving a note here to acknowledge the reply, thank you. I'll need to experiment with TState to see if it'll output the way I'm thinking. I'll get back soon

@amanda-tarafa
Copy link
Contributor

Yep, no rush at all.

@snakefoot
Copy link
Contributor

@amanda-tarafa amanda-tarafa added type: question Request for information or clarification. Not an issue. api: logging Issues related to the Cloud Logging API. priority: p3 Desirable enhancement or fix. May not be included in next release. type: feature request ‘Nice-to-have’ improvement, new feature or different behavior or design. and removed type: feature request ‘Nice-to-have’ improvement, new feature or different behavior or design. type: question Request for information or clarification. Not an issue. labels Apr 1, 2021
@amanda-tarafa
Copy link
Contributor

@jstafford5380 Just wanted to check if you've had a chance to try ILogger.Log<TState>(LogLevel, EventId, TState, Exception, Func<TState, Exception, string>) to add extra properties to log entries?

@jstafford5380
Copy link
Author

jstafford5380 commented Apr 2, 2021 via email

@amanda-tarafa
Copy link
Contributor

That's fine. I'll mark this one as needs more info and if in a few days we haven't had an upate from you we will close it. You can just reopen when you are ready to try things out again and have questions etc.

@amanda-tarafa amanda-tarafa added the needs more info This issue needs more information from the customer to proceed. label Apr 6, 2021
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards googleapis#5313, googleapis#5360, googleapis#5929 and googleapis#6367
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards googleapis#5313, googleapis#5360, googleapis#5929 and googleapis#6367
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards googleapis#5313, googleapis#5360, googleapis#5929 and googleapis#6367
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards googleapis#5313, googleapis#5360, googleapis#5929 and googleapis#6367
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 8, 2021
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 16, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards googleapis#5313, googleapis#5360, googleapis#5929 and googleapis#6367
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 16, 2021
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 16, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards googleapis#5313, googleapis#5360, googleapis#5929 and googleapis#6367
amanda-tarafa added a commit to amanda-tarafa/google-cloud-dotnet that referenced this issue Jun 16, 2021
amanda-tarafa added a commit that referenced this issue Jun 16, 2021
Moves GoogleLoggerScope to Diagnostics.Common.
In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
Towards #5313, #5360, #5929 and #6367
jskeet added a commit to jskeet/google-cloud-dotnet that referenced this issue Jun 24, 2021
Changes in Google.Cloud.Diagnostics.AspNetCore version 4.3.0-beta01:

- [Commit 60e8cd8](googleapis@60e8cd8):
  - feat: Copies GoogleLogger to Common. This allows easier use of GoogleLogger in non ASP.NET Core applications.
  - Towards [issue 6367](googleapis#6367)
  - Replicate LoggerOptions in Common, and have AspNetCore\*.LoggerOptions be just a wrapper of Common.LoggerOptions.
  - Copies ILogEntryLabelProvider to Common and marks the one in AspNetCore* Obsolete.
  - Makes AspNetCore*.IExternalTraceProvider obsolete. It can now be replaced by Common.ITraceContext.
- [Commit 32cb606](googleapis@32cb606):
  - feat: Allows per log entry labels.
  - Closes [issue 5313](googleapis#5313)
  - Closes [issue 5929](googleapis#5929)
- [Commit c8e9a48](googleapis@c8e9a48):
  - refactor: Makes GoogleLoggerScope extendable.
    Moves GoogleLoggerScope to Diagnostics.Common.
    In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
    Towards [issue 5313](googleapis#5313), [issue 5360](googleapis#5360), [issue 5929](googleapis#5929) and [issue 6367](googleapis#6367)
- [Commit 7f5f89e](googleapis@7f5f89e):
  - docs: Change Stackdriver to Google Cloud, and fix some typos, including in test code.
- [Commit c4c9cd5](googleapis@c4c9cd5):
  - feat: Makes it easier to use tracing from non ASP.NET Core applications
    Closes [issue 5897](googleapis#5897)
    Towards [issue 6367](googleapis#6367)
- [Commit b35b9ea](googleapis@b35b9ea):
  - feat: Decouples Diagnostics tracing from Google's trace header. Towards [issue 5360](googleapis#5360) and [issue 5897](googleapis#5897)
- [Commit 0c00d2c](googleapis@0c00d2c):
  - refactor: Remove unnecesary service provider extension method. There's an equivalent method offered by Microsoft.Extensions.DependencyInjection so we don't need our own.
- [Commit bb0c7b2](googleapis@bb0c7b2):
  - refactor: Remove unnecesary interface IManagedTracerFactory. It's an internal interface that we don't use anywhere. We can always add it back in if we need it at some point.
- [Commit 8ef3983](googleapis@8ef3983):
  - fix: X-Cloud-Trace-Context trace mask values should be 0-1. See https://cloud.google.com/trace/docs/setup#force-trace

Note: changing a generic type parameter constraint in
`LabelProviderExtensions` is notionally a breaking change, but due
to how it will be used, we don't expect it to actually break any customers.

Changes in Google.Cloud.Diagnostics.AspNetCore3 version 4.3.0-beta01:

- [Commit 60e8cd8](googleapis@60e8cd8):
  - feat: Copies GoogleLogger to Common.
  - This allows easier use of GoogleLogger in non ASP.NET Core applications.
  - Towards [issue 6367](googleapis#6367)
  - Replicate LoggerOptions in Common.
    - And have AspNetCore*.LoggerOptions be just a wrapper of Common.LoggerOptions.
  - Copies ILogEntryLabelProvider to Common.
    - And marks the one in AspNetCore* Obsolete.
  - Makes AspNetCore*.IExternalTraceProvider obsolete.
    - It can now be replaced by Common.ITraceContext.
- [Commit 32cb606](googleapis@32cb606):
  - feat: Allows per log entry labels.
  - Closes [issue 5313](googleapis#5313)
  - Closes [issue 5929](googleapis#5929)
- [Commit c8e9a48](googleapis@c8e9a48):
  - refactor: Makes GoogleLoggerScope extendable.
  - Moves GoogleLoggerScope to Diagnostics.Common.
  - In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
  - Towards [issue 5313](googleapis#5313), [issue 5360](googleapis#5360), [issue 5929](googleapis#5929) and [issue 6367](googleapis#6367)
- [Commit 7f5f89e](googleapis@7f5f89e):
  - docs: Change Stackdriver to Google Cloud
  - And fix some typos, including in test code.
- [Commit c4c9cd5](googleapis@c4c9cd5):
  - feat: Makes it easier to use tracing from non ASP.NET Core applications
  - Closes [issue 5897](googleapis#5897)
  - Towards [issue 6367](googleapis#6367)
- [Commit b35b9ea](googleapis@b35b9ea):
  - feat: Decouples Diagnostics tracing from Google's trace header
  - Towards [issue 5360](googleapis#5360) and [issue 5897](googleapis#5897)
- [Commit bb0c7b2](googleapis@bb0c7b2):
  - refactor: Remove unnecesary interface IManagedTracerFactory.
  - It's an internal interface that we don't use anywhere. We can always add it back in if we need it at some point.
- [Commit 8ef3983](googleapis@8ef3983):
  - fix: X-Cloud-Trace-Context trace mask values should be 0-1.
  - See https://cloud.google.com/trace/docs/setup#force-trace

Packages in this release:
- Release Google.Cloud.Diagnostics.AspNetCore version 4.3.0-beta01
- Release Google.Cloud.Diagnostics.AspNetCore3 version 4.3.0-beta01
- Release Google.Cloud.Diagnostics.Common version 4.3.0-beta01
jskeet added a commit to jskeet/google-cloud-dotnet that referenced this issue Jun 24, 2021
Changes in Google.Cloud.Diagnostics.AspNetCore version 4.3.0-beta01:

- [Commit 60e8cd8](googleapis@60e8cd8):
  - feat: Copies GoogleLogger to Common. This allows easier use of GoogleLogger in non ASP.NET Core applications.
  - Towards [issue 6367](googleapis#6367)
  - Replicate LoggerOptions in Common, and have AspNetCore\*.LoggerOptions be just a wrapper of Common.LoggerOptions.
  - Copies ILogEntryLabelProvider to Common and marks the one in AspNetCore* Obsolete.
  - Makes AspNetCore*.IExternalTraceProvider obsolete. It can now be replaced by Common.ITraceContext.
- [Commit 32cb606](googleapis@32cb606):
  - feat: Allows per log entry labels.
  - Closes [issue 5313](googleapis#5313)
  - Closes [issue 5929](googleapis#5929)
- [Commit c8e9a48](googleapis@c8e9a48):
  - refactor: Makes GoogleLoggerScope extendable.
    Moves GoogleLoggerScope to Diagnostics.Common.
    In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
    Towards [issue 5313](googleapis#5313), [issue 5360](googleapis#5360), [issue 5929](googleapis#5929) and [issue 6367](googleapis#6367)
- [Commit 7f5f89e](googleapis@7f5f89e):
  - docs: Change Stackdriver to Google Cloud, and fix some typos, including in test code.
- [Commit c4c9cd5](googleapis@c4c9cd5):
  - feat: Makes it easier to use tracing from non ASP.NET Core applications
    Closes [issue 5897](googleapis#5897)
    Towards [issue 6367](googleapis#6367)
- [Commit b35b9ea](googleapis@b35b9ea):
  - feat: Decouples Diagnostics tracing from Google's trace header. Towards [issue 5360](googleapis#5360) and [issue 5897](googleapis#5897)
- [Commit 0c00d2c](googleapis@0c00d2c):
  - refactor: Remove unnecesary service provider extension method. There's an equivalent method offered by Microsoft.Extensions.DependencyInjection so we don't need our own.
- [Commit bb0c7b2](googleapis@bb0c7b2):
  - refactor: Remove unnecesary interface IManagedTracerFactory. It's an internal interface that we don't use anywhere. We can always add it back in if we need it at some point.
- [Commit 8ef3983](googleapis@8ef3983):
  - fix: X-Cloud-Trace-Context trace mask values should be 0-1. See https://cloud.google.com/trace/docs/setup#force-trace

Note: changing a generic type parameter constraint in
`LabelProviderExtensions` is notionally a breaking change, but due
to how it will be used, we don't expect it to actually break any customers.

Changes in Google.Cloud.Diagnostics.AspNetCore3 version 4.3.0-beta01:

- [Commit 60e8cd8](googleapis@60e8cd8):
  - feat: Copies GoogleLogger to Common. This allows easier use of GoogleLogger in non ASP.NET Core applications.
  - Towards [issue 6367](googleapis#6367)
  - Replicate LoggerOptions in Common, and have AspNetCore\*.LoggerOptions be just a wrapper of Common.LoggerOptions.
  - Copies ILogEntryLabelProvider to Common and marks the one in AspNetCore* Obsolete.
  - Makes AspNetCore*.IExternalTraceProvider obsolete. It can now be replaced by Common.ITraceContext.
- [Commit 32cb606](googleapis@32cb606):
  - feat: Allows per log entry labels.
  - Closes [issue 5313](googleapis#5313)
  - Closes [issue 5929](googleapis#5929)
- [Commit c8e9a48](googleapis@c8e9a48):
  - refactor: Makes GoogleLoggerScope extendable.
    Moves GoogleLoggerScope to Diagnostics.Common.
    In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
    Towards [issue 5313](googleapis#5313), [issue 5360](googleapis#5360), [issue 5929](googleapis#5929) and [issue 6367](googleapis#6367)
- [Commit 7f5f89e](googleapis@7f5f89e):
  - docs: Change Stackdriver to Google Cloud, and fix some typos, including in test code.
- [Commit c4c9cd5](googleapis@c4c9cd5):
  - feat: Makes it easier to use tracing from non ASP.NET Core applications
    Closes [issue 5897](googleapis#5897)
    Towards [issue 6367](googleapis#6367)
- [Commit b35b9ea](googleapis@b35b9ea):
  - feat: Decouples Diagnostics tracing from Google's trace header. Towards [issue 5360](googleapis#5360) and [issue 5897](googleapis#5897)
- [Commit 0c00d2c](googleapis@0c00d2c):
  - refactor: Remove unnecesary service provider extension method. There's an equivalent method offered by Microsoft.Extensions.DependencyInjection so we don't need our own.
- [Commit bb0c7b2](googleapis@bb0c7b2):
  - refactor: Remove unnecesary interface IManagedTracerFactory. It's an internal interface that we don't use anywhere. We can always add it back in if we need it at some point.
- [Commit 8ef3983](googleapis@8ef3983):
  - fix: X-Cloud-Trace-Context trace mask values should be 0-1. See https://cloud.google.com/trace/docs/setup#force-trace

Note: changing a generic type parameter constraint in
`LabelProviderExtensions` is notionally a breaking change, but due
to how it will be used, we don't expect it to actually break any customers.

Packages in this release:
- Release Google.Cloud.Diagnostics.AspNetCore version 4.3.0-beta01
- Release Google.Cloud.Diagnostics.AspNetCore3 version 4.3.0-beta01
- Release Google.Cloud.Diagnostics.Common version 4.3.0-beta01
jskeet added a commit that referenced this issue Jun 24, 2021
Changes in Google.Cloud.Diagnostics.AspNetCore version 4.3.0-beta01:

- [Commit 60e8cd8](60e8cd8):
  - feat: Copies GoogleLogger to Common. This allows easier use of GoogleLogger in non ASP.NET Core applications.
  - Towards [issue 6367](#6367)
  - Replicate LoggerOptions in Common, and have AspNetCore\*.LoggerOptions be just a wrapper of Common.LoggerOptions.
  - Copies ILogEntryLabelProvider to Common and marks the one in AspNetCore* Obsolete.
  - Makes AspNetCore*.IExternalTraceProvider obsolete. It can now be replaced by Common.ITraceContext.
- [Commit 32cb606](32cb606):
  - feat: Allows per log entry labels.
  - Closes [issue 5313](#5313)
  - Closes [issue 5929](#5929)
- [Commit c8e9a48](c8e9a48):
  - refactor: Makes GoogleLoggerScope extendable.
    Moves GoogleLoggerScope to Diagnostics.Common.
    In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
    Towards [issue 5313](#5313), [issue 5360](#5360), [issue 5929](#5929) and [issue 6367](#6367)
- [Commit 7f5f89e](7f5f89e):
  - docs: Change Stackdriver to Google Cloud, and fix some typos, including in test code.
- [Commit c4c9cd5](c4c9cd5):
  - feat: Makes it easier to use tracing from non ASP.NET Core applications
    Closes [issue 5897](#5897)
    Towards [issue 6367](#6367)
- [Commit b35b9ea](b35b9ea):
  - feat: Decouples Diagnostics tracing from Google's trace header. Towards [issue 5360](#5360) and [issue 5897](#5897)
- [Commit 0c00d2c](0c00d2c):
  - refactor: Remove unnecesary service provider extension method. There's an equivalent method offered by Microsoft.Extensions.DependencyInjection so we don't need our own.
- [Commit bb0c7b2](bb0c7b2):
  - refactor: Remove unnecesary interface IManagedTracerFactory. It's an internal interface that we don't use anywhere. We can always add it back in if we need it at some point.
- [Commit 8ef3983](8ef3983):
  - fix: X-Cloud-Trace-Context trace mask values should be 0-1. See https://cloud.google.com/trace/docs/setup#force-trace

Note: changing a generic type parameter constraint in
`LabelProviderExtensions` is notionally a breaking change, but due
to how it will be used, we don't expect it to actually break any customers.

Changes in Google.Cloud.Diagnostics.AspNetCore3 version 4.3.0-beta01:

- [Commit 60e8cd8](60e8cd8):
  - feat: Copies GoogleLogger to Common. This allows easier use of GoogleLogger in non ASP.NET Core applications.
  - Towards [issue 6367](#6367)
  - Replicate LoggerOptions in Common, and have AspNetCore\*.LoggerOptions be just a wrapper of Common.LoggerOptions.
  - Copies ILogEntryLabelProvider to Common and marks the one in AspNetCore* Obsolete.
  - Makes AspNetCore*.IExternalTraceProvider obsolete. It can now be replaced by Common.ITraceContext.
- [Commit 32cb606](32cb606):
  - feat: Allows per log entry labels.
  - Closes [issue 5313](#5313)
  - Closes [issue 5929](#5929)
- [Commit c8e9a48](c8e9a48):
  - refactor: Makes GoogleLoggerScope extendable.
    Moves GoogleLoggerScope to Diagnostics.Common.
    In preparation for allowing LogEntry augmentation and making it easier to use Google logging from non ASP.NET Core apps.
    Towards [issue 5313](#5313), [issue 5360](#5360), [issue 5929](#5929) and [issue 6367](#6367)
- [Commit 7f5f89e](7f5f89e):
  - docs: Change Stackdriver to Google Cloud, and fix some typos, including in test code.
- [Commit c4c9cd5](c4c9cd5):
  - feat: Makes it easier to use tracing from non ASP.NET Core applications
    Closes [issue 5897](#5897)
    Towards [issue 6367](#6367)
- [Commit b35b9ea](b35b9ea):
  - feat: Decouples Diagnostics tracing from Google's trace header. Towards [issue 5360](#5360) and [issue 5897](#5897)
- [Commit 0c00d2c](0c00d2c):
  - refactor: Remove unnecesary service provider extension method. There's an equivalent method offered by Microsoft.Extensions.DependencyInjection so we don't need our own.
- [Commit bb0c7b2](bb0c7b2):
  - refactor: Remove unnecesary interface IManagedTracerFactory. It's an internal interface that we don't use anywhere. We can always add it back in if we need it at some point.
- [Commit 8ef3983](8ef3983):
  - fix: X-Cloud-Trace-Context trace mask values should be 0-1. See https://cloud.google.com/trace/docs/setup#force-trace

Note: changing a generic type parameter constraint in
`LabelProviderExtensions` is notionally a breaking change, but due
to how it will be used, we don't expect it to actually break any customers.

Packages in this release:
- Release Google.Cloud.Diagnostics.AspNetCore version 4.3.0-beta01
- Release Google.Cloud.Diagnostics.AspNetCore3 version 4.3.0-beta01
- Release Google.Cloud.Diagnostics.Common version 4.3.0-beta01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: logging Issues related to the Cloud Logging API. needs more info This issue needs more information from the customer to proceed. priority: p3 Desirable enhancement or fix. May not be included in next release. type: feature request ‘Nice-to-have’ improvement, new feature or different behavior or design.
Projects
None yet
4 participants