This monitor is a replacement for the SMNP component of Viz Engine. It uses Opentelemetry metrics and Opentelemetry logs to provide the information from OS shared memory, written by a Viz Engine instance if configured to do so.
Application Name: Viz Engine Monitor
Enterprise ID:
27566.3.1.7.
%N
, where %N
is the instance number without leading zeros.
Installation
msiexec /i
"VizEngineMonitor-xxx.msi"
/qn
Using the installer installs the application as a service. The service is installed as first instance by default. For further instances please refer to Install Service.
Before running the application, the configuration files must be adjusted for OpenTelemetry endpoints and logging destination.
Configuration
Viz Engine has to be configured to write the status information.
The Viz Engine Monitor requires OpenTelemetry endpoints for logs and metrics, that are up and running.
These endpoints need to be configured in the Viz Engine Monitor Configuration.
Viz Engine Configuration
Viz Engine needs to be configured to write the OS shared memory. Please make sure shm_system_status_enabled
is set to 1
in the Viz Engine configuration file.
OpenTelemetry Endpoints
The Viz Engine Monitor expects end endpoint for logs, and an endpoint for metrics for OpenTelemetry HTTP transport. They usually look like:
Viz Engine Monitor Configuration
The configuration files are located at %PROGRAMDATA%\\Vizrt\\Engine_Monitor\\cfg. The location may be changed with application arguments. See also usage below.
The configuration is done in vizeng_monitor%N.json, or, if it cannot find this file, in vizeng_monitor.json. The %N
is replaced by the instance number with a two digit format.
For the first instance, the configuration file is searched at vizeng_monitor01.json and then at vizeng_monitor.json. If the instance number is not found, the first instance is used.
Example configuration file vizeng_monitor01.json:
{
"version"
:
"1.0"
,
"sleep_time_ms"
:
100
,
"verbose_messages"
:
false
,
"report_expected_messages"
:
false
,
"metric_config"
:
"otel_metrics_1"
}
Parameters for Engine Monitor Configuration
version: The version of the configuration file. This is used to check if the configuration file is compatible.
sleep_time_ms: The time in milliseconds between two runs. Default is 100 milliseconds.
verbose_messages: If set to true it log more details in each log message. Default is false.
report_expected_messages: If set to true then expected failures, are emitted as well as regular info logs. Default is false.
metric_config: The
id
to use in the metrics array of viz component logger configuration. Default isotel_metrics_1
.
Usually an instance of this application is installed for each Viz Engine to monitor.
Viz Component Log Configuration
The configuration for logging is located in vcl_config%N.json, or, if it cannot find this file, in vcl_config.json. The %N
is replaced by the instance number with a two digit format. If the instance number is not found, the first instance is used.
For example, for the third instance, the configuration file is searched at vcl_config03.json and then at vcl_config.json.
OpenTelemetry Logs Endpoint
In the default configuration, the metrics endpoint is located at backend/concrete/otel_log/exporter/http/endpoint
.
"backend"
: [
{
"id"
:
"backend_id_otel"
,
"concrete"
: {
"otel_log"
: {
"exporter"
: {
"type"
:
"http"
,
"http"
: {
"endpoint"
:
"http://127.0.0.1:4318/v1/logs"
,
...
OpenTelemetry Metrics Endpoint
In the default configuration the metrics endpoint is located at metrics/concrete/otel_metrics/exporter/http/endpoint
.
"metrics"
: [
{
"id"
:
"otel_metrics_1"
,
"concrete"
: {
"otel_metrics"
: {
"exporter"
: {
"type"
:
"http"
,
"http"
: {
"endpoint"
:
"http://localhost:4318/v1/metrics"
,
...
Usage
"%ProgramFiles%\Vizrt\Engine_Monitor\vizeng_monitor.exe"
-h
The application can be started as a service or as a console application. The service is by default installed as first instance, by the installer.
For debugging, the console application can be started with the -c
parameter. Usually, the console mode is combined with a path to the configuration and log files, -p
.
vizeng_monitor.exe -c -p "some\where\" -n
3
In this case, the configuration files are searched at some\\where\\cfg\\license_monitor03.json, some\\where\\cfg\\license_monitor.json and the log files are stored at some\\where\\log\\.
The service may also be installed, uninstalled, started, or stopped.
Install Service
To install a service manually (for example, for multiple instances on one host), the -n
parameter is used to specify the instance number.
vizeng_monitor.exe -i [-n instance]
vizeng_monitor.exe -i -n 3
registers a service with the name.Vizrt Viz Engine Monitor_3
for the third instance.
Uninstall Service
To uninstall a service manually (for example, for multiple instances on one host), the -n
parameter is used to specify the instance number.
vizeng_monitor.exe -u [-n instance]
vizeng_monitor.exe -u
unregisters the service with the name.Vizrt Viz Engine Monitor_1
for the first instance.
Start Installed Service
To start a registered service manually (for example, for multiple instances on one host), the -n
parameter is used to specify the instance number.
vizeng_monitor.exe -r [-n instance]
vizeng_monitor.exe -r -n 2
starts the registered service with the name.Vizrt Viz Engine Monitor_2
for the second instance.
Stop Installed Service
To stop a registered service manually, the -n
parameter is used to specify the instance number.
vizeng_monitor.exe -k [-n instance]
vizeng_monitor.exe -k -n 2
stops a running service with the name.Vizrt Viz Engine Monitor_2
for the second instance.
Troubleshooting
The application uses a bootstrap logger that writes to the console, and this logger is used to log errors during startup. In case the logs are not emitted where they should be, the bootstrap logger shows any log configuration errors. For this to work, the application must be started in console mode. A registered service does not need to be unregistered first, but it is recommended to stop the service before starting the application in console mode.
vizeng_monitor.exe -c ...
Using a log file instead of Opentelemetry is a good way to check if the application is running correctly. See configuration above.
Logged Information
For each iteration, the following log records are logged.
Common to all log records, are these key/value pairs in the default
group:
host.name: The hostname of the origin of the message.
service.instance.id: The instance number of the application.
service.name: The name of the application,
license_monitor
.app_version: The version of the application.
vizrt.service.oid: The OID of the application,
27566.3.1.7.
%N
, where %N
is the instance number without leading zeros.
Shared Memory Information Logs
Logged as shm metric
in the vizrt.details
group:
metrics_for_oid: The OID for the app to which this log belongs to.
27566.3.3.1.
%N
, where %N
is the instance number without leading zeros.TCPPort: TCP port the application is listening to.
ComputerType: String identifying the computer type.
SystemID: String identifying the system ID.
VizVersionStr: Version of Viz Engine.
SceneFront: Scene loaded into the front layer.
SceneMid: Scene loaded into the middle layer.
SceneBack: Scene loaded into the back layer.
ScenePostFront: Scene loaded into the front layer in post mode.
ScenePostMid: Scene loaded into the middle layer in post mode.
ScenePostBack: Scene loaded into the back layer in post mode.
Shared Memory Information Metrics
Emitted with %N replaced by the instance id.
shm.27566.3.3.1.
%N.OnAir_gauge
: True if On-Air.shm.27566.3.3.1.
%N.ConnectedToDb_gauge
: True if connected to a Graphic Hub.shm.27566.3.3.1.
%N.GenlockStatus_gauge
: Status of Genlock.shm.27566.3.3.1.
%N.CurrentFrameRate_gauge
: Current framerate in frames per second.shm.27566.3.3.1.
%N.VideoIn.1_gauge
: Status of Video Input 1.shm.27566.3.3.1.
%N.VideoIn.2_gauge
: Status of Video Input 2.shm.27566.3.3.1.
%N.VideoIn.3_gauge
: Status of Video Input 3.shm.27566.3.3.1.
%N.VideoIn.4_gauge
: Status of Video Input 4.shm.27566.3.3.1.
%N.VideoIn.5_gauge
: Status of Video Input 5.shm.27566.3.3.1.
%N.VideoIn.6_gauge
: Status of Video Input 6.shm.27566.3.3.1.
%N.VideoIn.7_gauge
: Status of Video Input 7.shm.27566.3.3.1.
%N.VideoIn.8_gauge
: Status of Video Input 8.shm.27566.3.3.1.
%N.ClipIn.1_gauge
: Status of Clip Input 1.shm.27566.3.3.1.
%N.ClipIn.2_gauge
: Status of Clip Input 2.shm.27566.3.3.1.
%N.ClipIn.3_gauge
: Status of Clip Input 3.shm.27566.3.3.1.
%N.ClipIn.4_gauge
: Status of Clip Input 4.shm.27566.3.3.1.
%N.ClipIn.5_gauge
: Status of Clip Input 5.shm.27566.3.3.1.
%N.ClipIn.6_gauge
: Status of Clip Input 6.shm.27566.3.3.1.
%N.ClipIn.7_gauge
: Status of Clip Input 7.shm.27566.3.3.1.
%N.ClipIn.8_gauge
: Status of Clip Input 8.shm.27566.3.3.1.
%N.TextureMemory.Free_gauge
: Free texture memory in KB.shm.27566.3.3.1.
%N.TextureMemory.Total_gauge
: Total texture memory in KB.shm.27566.3.3.1.
%N.TextureMemory.Used_gauge
: Used texture memory in %.shm.27566.3.3.1.
%N.Post_gauge
: Post mode is active.shm.27566.3.3.1.
%N.IsNLE_gauge
: NLE mode is active.shm.27566.3.3.1.
%N.ReadyForConnect_gauge
: Viz Engine is initialized and ready to receive commands.shm.27566.3.3.1.
%N.RetraceCounterMoving_gauge
: true if retrace counter changed since the last run.
Where Status for Genlock, Video and Clip Inputs is one of the following:
0: OK
1: Wrong Format
2: Bad
3: Dropped Frames
255: Not Available
Complete Engine Configuration File
Example configuration file vcl_config.json:
{
"async"
: [
{
"id"
:
"async_1_id"
,
"num_items"
:
1200
,
"num_workers"
:
4
,
"overflow_policy"
:
"overrun_oldest"
}
],
"attribute"
: [
{
"id"
:
"vcl_config_logger_attributes_id"
,
"multi_attributes"
: [
{
"sdid_name"
:
"config"
,
"single_attributes"
: [
{
"param_name"
:
"facility"
,
"param_value"
:
"vcl config"
}
]
}
]
}
],
"formatter"
: [
{
"id"
:
"formatter_txt"
,
"concrete"
: {
"formatter_simple"
: {
"attr_prefix"
:
"\n "
,
"attr_assign"
:
"="
,
"attr_postfix"
:
""
,
"attr_separator"
:
""
,
"attr_name_escape"
:
"\n\r\t\"\\{} "
,
"attr_value_escape"
:
"\n\r\t\""
,
"group_prefix"
:
"\n "
,
"group_assign"
:
": "
,
"group_postfix"
:
""
,
"group_separator"
:
""
,
"group_name_escape"
:
"\n\r\t\"\\{} "
,
"groups_prefix"
:
""
,
"groups_postfix"
:
""
,
"payload_prefix"
:
" <<"
,
"payload_postfix"
:
">>"
,
"payload_escape"
:
"\n\r\t\""
}
}
},
{
"id"
:
"formatter_compact"
,
"concrete"
: {
"formatter_simple"
: {
"attr_prefix"
:
"{\""
,
"attr_assign"
:
"\"=\""
,
"attr_postfix"
:
"\"}"
,
"attr_separator"
:
", "
,
"attr_name_escape"
:
"\n\r\t\"\\{} "
,
"attr_value_escape"
:
"\n\r\t\""
,
"group_prefix"
:
"{ \""
,
"group_assign"
:
"\": "
,
"group_postfix"
:
" }"
,
"group_separator"
:
"; "
,
"group_name_escape"
:
"\n\r\t\"\\{} "
,
"groups_prefix"
:
"["
,
"groups_postfix"
:
"]"
,
"payload_prefix"
:
" <<"
,
"payload_postfix"
:
">> "
,
"payload_escape"
:
"\n\r\t\""
}
}
}
],
"backend"
: [
{
"id"
:
"collection_id_console"
,
"concrete"
: {
"backend_collection"
: {
"backend_refs"
: [
"backend_cout"
,
"backend_id_logfile"
,
"backend_id_otel"
]
}
}
},
{
"id"
:
"collection_id_service"
,
"concrete"
: {
"backend_collection"
: {
"backend_refs"
: [
"backend_id_logfile"
,
"backend_id_otel"
]
}
}
},
{
"id"
:
"collection_id_control"
,
"concrete"
: {
"backend_collection"
: {
"backend_refs"
: [
"backend_id_control"
]
}
}
},
{
"id"
:
"backend_vcl_config"
,
"concrete"
: {
"spdlog"
: {
"attribute_ref"
:
""
,
"formatter_ref"
:
"formatter_compact"
,
"spdlog_format"
:
"%v"
,
"spdlog_time_type"
:
"utc"
,
"spdlog_eol"
:
"default"
,
"dup_filter_max_skip_duration"
:
10
,
"spdlog_log_level"
:
"debug"
,
"spdlog_flush_level"
:
"debug"
,
"rotating_file_sink"
: {
"base_filename"
:
"vcl_config_%N"
,
"max_size_MB"
:
1024
,
"max_files"
:
20
,
"rotate_on_open"
:
false
}
}
}
},
{
"id"
:
"backend_cout_terse"
,
"concrete"
: {
"cout_terse"
: {
"attribute_ref"
:
""
}
}
},
{
"id"
:
"backend_cout"
,
"concrete"
: {
"cout"
: {
"formatter_ref"
:
"formatter_txt"
}
}
},
{
"id"
:
"backend_id_logfile"
,
"concrete"
: {
"spdlog"
: {
"attribute_ref"
:
""
,
"formatter_ref"
:
"formatter_txt"
,
"spdlog_format"
:
"%v"
,
"spdlog_time_type"
:
"utc"
,
"spdlog_eol"
:
"default"
,
"dup_filter_max_skip_duration"
:
10
,
"spdlog_log_level"
:
"debug"
,
"spdlog_flush_level"
:
"debug"
,
"rotating_file_sink"
: {
"base_filename"
:
"id_%N_monitor"
,
"max_size_MB"
:
1024
,
"max_files"
:
20
,
"rotate_on_open"
:
false
}
}
}
},
{
"id"
:
"backend_id_otel"
,
"concrete"
: {
"otel_log"
: {
"exporter"
: {
"type"
:
"http"
,
"grpc"
: {
"endpoint"
:
"localhost:4317"
,
"use_ssl_credentials"
:
false
,
"ssl_ca_cert_path"
:
""
,
"max_threads"
:
4
,
"timeout_seconds"
:
1
},
"http"
: {
"endpoint"
:
"http://127.0.0.1:4318/v1/logs"
,
"content_type"
:
""
,
"use_json_name"
:
false
,
"console_debug"
:
false
,
"timeout_seconds"
:
1
,
"max_concurrent_requests"
:
0
,
"max_requests_per_connection"
:
0
,
"ssl_insecure_skip_verify"
:
true
,
"ssl_ca_cert_path"
:
""
,
"ssl_ca_cert_string"
:
""
,
"ssl_client_key_path"
:
""
,
"ssl_client_key_string"
:
""
,
"ssl_client_cert_path"
:
""
,
"ssl_client_cert_string"
:
""
,
"ssl_min_tls"
:
""
,
"ssl_max_tls"
:
""
,
"ssl_cipher"
:
""
,
"ssl_cipher_suite"
:
""
,
"compression"
:
""
,
"retry_policy_max_attempts"
:
0
,
"retry_policy_initial_backoff"
:
1.0
,
"retry_policy_max_backoff"
:
60.0
,
"retry_policy_backoff_multiplier"
:
1.5
,
"api_key"
:
""
}
}
}
}
},
{
"id"
:
"backend_id_control"
,
"concrete"
: {
"spdlog"
: {
"attribute_ref"
:
""
,
"formatter_ref"
:
"formatter_compact"
,
"spdlog_format"
:
"%v"
,
"spdlog_time_type"
:
"utc"
,
"spdlog_eol"
:
"default"
,
"dup_filter_max_skip_duration"
:
10
,
"spdlog_log_level"
:
"debug"
,
"spdlog_flush_level"
:
"debug"
,
"rotating_file_sink"
: {
"base_filename"
:
"id_%N_control"
,
"max_size_MB"
:
1024
,
"max_files"
:
20
,
"rotate_on_open"
:
false
}
}
}
},
{
"id"
:
"backend_id_mapping"
,
"concrete"
: {
"spdlog"
: {
"attribute_ref"
:
""
,
"formatter_ref"
:
"formatter_compact"
,
"spdlog_format"
:
"%v"
,
"spdlog_time_type"
:
"utc"
,
"spdlog_eol"
:
"default"
,
"dup_filter_max_skip_duration"
:
10
,
"spdlog_log_level"
:
"debug"
,
"spdlog_flush_level"
:
"debug"
,
"rotating_file_sink"
: {
"base_filename"
:
"id_%N_mapping"
,
"max_size_MB"
:
1024
,
"max_files"
:
20
,
"rotate_on_open"
:
false
}
}
}
}
],
"xlate_logger"
: [
{
""
:
"default_logger_id_%N"
},
{
"vizrt/vlc_config"
:
"vcl_config_logger"
},
{
"xx_vizrt/os_lib"
:
"logger_id_control"
},
{
"xx_vizrt/wibu"
:
"logger_id_control"
},
{
"vizrt/app/viz_engine/monitor"
:
"logger_id_control"
},
{
"vizrt/app/viz_engine/monitor/"
:
"logger_id_control"
},
{
"vizrt/app/viz_engine/monitor/console"
:
"logger_id_console"
},
{
"vizrt/app/viz_engine/monitor/service"
:
"logger_id_service"
},
{
"vizrt/app/viz_engine/monitor/console/mapping"
:
"logger_id_mapping"
},
{
"vizrt/app/viz_engine/monitor/service/mapping"
:
"logger_id_mapping"
}
],
"logger"
: [
{
"id"
:
"null_logger"
,
"async_ref"
:
""
,
"concrete"
: {
"logger_simple"
: {
"backend_ref"
:
""
,
"attribute_ref"
:
""
,
"should_log_filter_ref"
:
""
,
"repeat_filter_ref"
:
""
}
}
},
{
"id"
:
"vcl_config_logger"
,
"async_ref"
:
""
,
"concrete"
: {
"logger_simple"
: {
"backend_ref"
:
"backend_vcl_config"
,
"attribute_ref"
:
"vcl_config_logger_attributes_id"
,
"should_log_filter_ref"
:
""
,
"repeat_filter_ref"
:
""
}
}
},
{
"id"
:
"logger_id_control"
,
"async_ref"
:
""
,
"concrete"
: {
"logger_simple"
: {
"backend_ref"
:
"collection_id_control"
,
"attribute_ref"
:
""
,
"should_log_filter_ref"
:
"minimum_debug_id"
,
"repeat_filter_ref"
:
""
}
}
},
{
"id"
:
"logger_id_console"
,
"async_ref"
:
""
,
"concrete"
: {
"logger_simple"
: {
"backend_ref"
:
"collection_id_console"
,
"attribute_ref"
:
""
,
"should_log_filter_ref"
:
"minimum_debug_id"
,
"repeat_filter_ref"
:
""
}
}
},
{
"id"
:
"logger_id_service"
,
"async_ref"
:
""
,
"concrete"
: {
"logger_simple"
: {
"backend_ref"
:
"collection_id_service"
,
"attribute_ref"
:
""
,
"should_log_filter_ref"
:
"minimum_info_id"
,
"repeat_filter_ref"
:
""
}
}
},
{
"id"
:
"logger_id_mapping"
,
"async_ref"
:
""
,
"concrete"
: {
"logger_simple"
: {
"backend_ref"
:
"backend_id_mapping"
,
"attribute_ref"
:
""
,
"should_log_filter_ref"
:
"minimum_info_id"
,
"repeat_filter_ref"
:
""
}
}
}
],
"repeat_filter"
: [
{
"id"
:
"repeat_filter_id"
,
"concrete"
: {
"repeat_error_code"
: {
"minimum_level"
:
"error"
,
"max_repeat_count"
:
100
,
"max_age"
:
10
}
}
},
{
"id"
:
"repeat_param_value_id"
,
"concrete"
: {
"repeat_error_code"
: {
"minimum_level"
:
"warning"
,
"max_repeat_count"
:
20
,
"max_age"
:
30
}
}
}
],
"should_log_filter"
: [
{
"id"
:
"minimum_debug_id"
,
"concrete"
: {
"minimum_severity"
: {
"minimum_level"
:
"debug"
}
}
},
{
"id"
:
"minimum_debug_fixed_id"
,
"concrete"
: {
"minimum_severity_fixed"
: {
"minimum_level"
:
"debug"
}
}
},
{
"id"
:
"minimum_info_id"
,
"concrete"
: {
"minimum_severity"
: {
"minimum_level"
:
"info"
}
}
},
{
"id"
:
"minimum_info_fixed_id"
,
"concrete"
: {
"minimum_severity_fixed"
: {
"minimum_level"
:
"info"
}
}
}
],
"metrics"
: [
{
"id"
:
"otel_metrics_1"
,
"concrete"
: {
"otel_metrics"
: {
"export_interval_ms"
:
1000
,
"export_timeout_ms"
:
500
,
"exporter"
: {
"type"
:
"http"
,
"grpc"
: {
"endpoint"
:
"localhost:4317"
,
"use_ssl_credentials"
:
false
,
"ssl_ca_cert_path"
:
""
,
"max_threads"
:
4
,
"timeout_seconds"
:
1
,
"aggregation_temporality"
:
"cumulative"
},
"http"
: {
"endpoint"
:
"http://localhost:4318/v1/metrics"
,
"content_type"
:
""
,
"use_json_name"
:
false
,
"console_debug"
:
false
,
"timeout_seconds"
:
1
,
"max_concurrent_requests"
:
0
,
"max_requests_per_connection"
:
0
,
"ssl_insecure_skip_verify"
:
true
,
"ssl_ca_cert_path"
:
""
,
"ssl_ca_cert_string"
:
""
,
"ssl_client_key_path"
:
""
,
"ssl_client_key_string"
:
""
,
"ssl_client_cert_path"
:
""
,
"ssl_client_cert_string"
:
""
,
"ssl_min_tls"
:
""
,
"ssl_max_tls"
:
""
,
"ssl_cipher"
:
""
,
"ssl_cipher_suite"
:
""
,
"compression"
:
""
,
"retry_policy_max_attempts"
:
0
,
"retry_policy_initial_backoff"
:
1.0
,
"retry_policy_max_backoff"
:
60.0
,
"retry_policy_backoff_multiplier"
:
1.5
,
"api_key"
:
""
,
"aggregation_temporality"
:
"cumulative"
}
}
}
}
}
],
"version"
:
"1.0"
}
Parameters for Viz Component Log Configuration
The loggers used are found under xlate_logger
:
vizrt/vlc_config
logger for viz component logger. Leave it to vcl_config_logger to have a bootstrap log file.vizrt/os_lib
logger for os lib component. This entry is missing by default to inherit the logger.vizrt/wibu
logger for wibu component. This entry is missing by default to inherit the logger.vizrt/app/viz_engine/monitor
andvizrt/app/viz_engine/monitor/
logger for the control mode operations, such as install as a service.vizrt/app/viz_engine/monitor/console
logger when running in console mode.vizrt/app/viz_engine/monitor/service
logger when running in service mode.vizrt/app/viz_engine/monitor/console/mapping
logger to map obstructed sensitive data as hash to real data when running in console mode. Not yet used.vizrt/app/viz_engine/monitor/service/mapping
logger to map obstructed sensitive data as hash to real data when running in service mode. Not yet used.
The usual customization points are then:
vizrt/app/viz_engine/monitor/console
This logs by default to console and log files.vizrt/app/viz_engine/monitor/service
This logs by default to log files and Opentelemetry endpoints.
Look up the translated logger and follow any backend_ref or backend_refs until you reach a concrete backend, such as otel, ... and configure their endpoints.
Example Backend otel Log
{
"id"
:
"backend_id_otel"
,
"concrete"
: {
"otel_log"
: {
"exporter"
: {
"type"
:
"http"
,
"http"
: {
"endpoint"
:
"<http://127.0.0.1:4318/v1/logs>"
,
"timeout_seconds"
:
1
,
"max_concurrent_requests"
:
0
,
"max_requests_per_connection"
:
0
,
"ssl_insecure_skip_verify"
:
true
,
}
}
}
}
}