@adobe/asset-compute-commons
v1.4.0
Published
Common utilities needed by all Adobe Asset Compute serverless actions
Downloads
307
Readme
see Asset Compute API Document: Asynchronous Events for more on this topic
Examples
Example with custom retry options:
const { AssetComputeEvents } = require('@adobe/asset-compute-commons');
const params = {
auth: {
accessToken: '12345',
orgId: 'orgId',
clientId: 'clientId`
}
}
const retry = {
retryMaxDuration: 1000 // in ms
}
const eventsHandler = new AssetComputeEvents(params, retry);
await eventsHandler.sendEvent('rendition_created', {
rendition: {
name: 'rendition.jpg',
fmt: 'jpg'
}
});
Example with a rendition_failed
event type:
const { AssetComputeEvents } = require('@adobe/asset-compute-commons');
const params = {
auth: {
accessToken: '12345',
orgId: 'orgId',
clientId: 'clientId`
}
}
const eventsHandler = new AssetComputeEvents(params);
await eventsHandler.sendEvent('rendition_failed', {
rendition: {
name: 'rendition.21',
fmt: '21'
},
errorReason: 'RenditionFormatUnsupported',
errorMessage: 'Rendition format `21` is not supported'
});
Asset Compute Metrics
Asset Compute metrics handler for sending New Relic metrics. It uses a node js agent node-openwhisk-newrelic to send metrics to New Relic.
Constructor parameters
AssetComputeMetrics
constructor supports the following mandatory parameters:
- params: Object must contain New Relic metrics parameters:
newRelicEventsURL
: New Relic Insights Events url (should be of the form:https://insights-collector.newrelic.com/v1/accounts/<YOUR_ACOUNT_ID>/events
)newRelicApiKey
: New Relic Insights API key (see the "Register an Insert API key" section here)
AssetComputeMetrics
constructor supports the following optional parameters:
- options: Other New Relic metric options supported by node-openwhisk-newrelic
Simple example
Initiates metrics handler, sends metrics and stops metrics agent:
const { AssetComputeMetrics } = require('@adobe/asset-compute-commons');
const params = {
newRelicEventsURL: 'https://insights-collector.newrelic.com/v1/accounts/<YOUR_ACOUNT_ID>/events',
newRelicApiKey: 'YOUR_API_KEY',
// ... rest of the Asset Compute parameters
}
const metricsHandler = new AssetComputeMetrics(params);
const metrics = {
downloadDuration: 200,
size: 3000
}
await metricsHandler.sendMetrics('rendition', metrics);
await metricsHandler.activationFinished(); // see https://github.com/adobe/node-openwhisk-newrelic#usage for information about `activationFinished()`
Other additional functions
Adding custom metrics:
metricsHandler.add({
uuid: '12345',
count: 2
});
Get current state of metrics
:
console.log(metricsHandler.get()); // should print out metrics added in `metricsHandler.add()`
Sending error metrics (sends metrics with event type error
):
const location = 'upload_worker_flite';
const message = 'Invalid file format';
const metrics = {
downloadDuration: 200,
size: 3000
}
await metricsHandler.sendErrorMetrics(location, message, metrics);
Sending client error metrics (sends metrics with event type client_error
):
const location = 'upload_worker_flite';
const message = 'Invalid file format';
const metrics = {
downloadDuration: 200,
size: 3000
}
await metricsHandler.sendClientErrorMetrics(location, message, metrics);
Sending error metrics by exceptions thrown (sends metrics with event type client_error
or error
depending on the error):
foo() {
try {
console.log('hello!');
} catch (error) {
metricsHandler.handleError(error, {
location: "mylocation",
message: "something failed",
metrics: {}
});
}
}
Asset Compute Errors
There are several custom errors used in Asset Compute workers:
Error types
| Type | Description | Properties |
| ---- | ----------- | ---------- |
| error
| unexpected errors and exceptions | message
, date
, location
|
| client_error
| errors caused by client misconfiguration | message
, date
, reason
|
Error Properties
message
: error messagedate
: current time in UTC of when the error was thrownlocation
: location where the error took place (only in typeerror
)reason
: the reason for the error (only in client errors)- must be one of list: "SourceFormatUnsupported", "RenditionFormatUnsupported", "SourceUnsupported", "SourceCorrupt", "RenditionTooLarge" }
Custom Errors
| Name | Description | Type |
|--------|-------------|----- |
| SourceFormatUnsupportedError
| The source is of an unsupported type. | client error |
| RenditionFormatUnsupportedError
| The requested format is unsupported. | client error |
| SourceUnsupportedError
| The specific source is unsupported even though the type is supported. | client error |
| SourceCorruptError
| The source data is corrupt. Includes empty files. | client error |
| RenditionTooLargeError
| The rendition could not be uploaded using the pre-signed URL(s) provided in target
. The actual rendition size is available as metadata in repo:size
and can be used by the client to re-process this rendition with the right number of pre-signed URLs. | client error |
| ArgumentError
| Wrong arguments (type, structure, etc.) | error |
| GenericError
| Any other error. | error |
Examples
Generic error downloading the source file in action worker-pie
:
const { GenericError } = require('@adobe/asset-compute-commons');
const message = 'Error while downloading source file!'
const location = 'download_worker_pie'
throw new GenericError(message, location);
Rendition format is unsupported:
const { RenditionFormatUnsupportedError } = require('@adobe/asset-compute-commons');
const message = 'Rendition format `sdfg` is not supported'
throw new RenditionFormatUnsupportedError(message);
Asset Compute Log Utils
Utilities for removing sensitive information from Asset Compute worker logs
Examples
Redacting access token from logs:
const { AssetComputeLogUtils } = require('@adobe/asset-compute-commons');
params = {
accessToken: '123453467',
fmt: 200
}
console.log("Asset Compute parameters:", AssetComputeLogUtils.redactUrl(params)); // should replace access token with "[...REDACTED...]"
Prints out exact same logs using AssetComputeLogUtils.log
method:
const { AssetComputeLogUtils } = require('@adobe/asset-compute-commons');
params = {
accessToken: '123453467',
fmt: 200
}
AssetComputeLogUtils.log(params, "Asset Compute parameters"); // should replace access token with "[...REDACTED...]"
Apache OpenWhisk Action Name
A simple way to get information about the Apache OpenWhisk action.
Properties (all default to empty strings)
- name: base Apache OpenWhisk action name
- package: Apache OpenWhisk package name
- namespace: Apache OpenWhisk namespace
- fullname: full Apache OpenWhisk action name, including namespace, package and action name from environment variable
__OW_ACTION_NAME
Examples:
const actionInfo = new OpenwhiskActionName();
console.log(actionInfo.name) // prints out something like `worker-pie`
console.log(actionInfo.package) // prints package name, ex: `experimental`
console.log(actionInfo.namespace) // prints namespace, ex: `stage`
console.log(actionInfo.fullname) // prints full name, ex: /stage/experimental/worker-pie
Asynchronous Events
When processing is finished, or if errors occurred, events are sent through Adobe I/O Events. Events are JSON objects in the event
field of the objects in the events
array of the jorunal response.
The I/O event type for all events of the Asset Compute service is asset_compute
. The journal will be automatically subscribed to this event type only, and consumers are not expected to filter based on the i/o event type.
The service specific event types are available in the type
property of the event.
Event Types
| Event | Description |
|--------|-------------|
| rendition_created
| Sent for each successfully processed and uploaded rendition. |
| rendition_failed
| Sent for each rendition that failed to process or upload. |
Event Attributes
| Attribute | Type | Event | Description |
|-------------|----------|---------------|-------------|
| date
| string
| *
| Timestamp when event was sent in simplified extended ISO-8601 format (as defined by Javascript Date.toISOString()). |
| requestId
| string
| *
| The request id of the original request to /process
, same as X-Request-Id
header. |
| source
| object
| *
| The source
of the /process
request. |
| userData
| object
| *
| The userData
of the /process
request if set. |
| rendition
| object
| rendition_*
| The corresponding rendition object passed in /process
. |
| metadata
| object
| rendition_created
| The metadata properties of the rendition. |
| errorReason
| string
| rendition_*
| Rendition failure reason if any. |
| errorMessage
| string
| rendition_*
| Text giving more detail about the rendition failure if any. |
Metadata
| Property | Description |
|--------|-------------|
| tiff:ImageWidth
| The width of the rendition in pixels. Will not be present if the rendition is not an image. |
| tiff:ImageLength
| The length of the rendition in pixels. Will not be present if the rendition is not an image. |
| repo:size
| The size of the rendition in bytes. |
| repo:sha1
| The sha1 digest of the rendition. |
Error Reasons
| Reason | Description |
|--------|-------------|
| SourceFormatUnsupported
| The source is of an unsupported type. |
| RenditionFormatUnsupported
| The requested format is unsupported. |
| SourceUnsupported
| The specific source is unsupported even though the type is supported. |
| SourceCorrupt
| The source data is corrupt. Includes empty files. |
| RenditionTooLarge
| The rendition could not be uploaded using the pre-signed URL(s) provided in target
. The actual rendition size is available as metadata in repo:size
and can be used by the client to re-process this rendition with the right number of pre-signed URLs. |
| GenericError
| Any other error. |
Contributing
Contributions are welcomed! Read the Contributing Guide for more information.
Licensing
This project is licensed under the Apache V2 License. See LICENSE for more information.