Name

sn_sow.SOWInvestigateUtils

Description

No description available

Script

var SOWInvestigateUtils = Class.create();
SOWInvestigateUtils.prototype = {

  ATTRIBUTES_FOR_VISUALIZATION_HISTORY: {
      "mem_percentage": true, // Memory utilization
      "disk_percentage": true, // Disk utilization
      "cpu_percentage": true, // CPU utilization
      "uptime": false // Uptime
  },

  initialize: function(sourceTable, sourceRecordId, ci, metricFetchType, sourcePage) {

      this.investigateConfig = new SOWInvestigateConfig();
      var definitionIds = this.investigateConfig.getDefinitionIds(sourceTable);
      this.SOURCE_TABLE = sourceTable;
      this.SOURCE_RECORD_ID = sourceRecordId;
      this.SOURCE_PAGE = sourcePage;
      this.arrayUtil = new global.ArrayUtil();

      this.RESULT = {
          overview: {
              "data": []
          },
          definitionGroupData: {
              hideSection: true,
              visualization: [],
              tabular: [],
          },
          visualization: [],
          tabular: [],
          uiMessage: {},
          ciStatus: {
              status: true,
              message: ""
          }
      };
      this.DEFINITION_IDS = [];
      this.DATA = {};

      if (definitionIds) {
          this.DEFINITION_IDS = definitionIds.split(",");
          this.CI = ci;
          this.DEFINITION_CONFIG = this.investigateConfig.DEFINITION_CONFIG;
          this.UI_TYPES = this.investigateConfig.UI_TYPES;
          this.metricFetchType = metricFetchType;
          this.definitionGroupConfig = this.investigateConfig.getDefinitionGroupConfig();
      }
  },

  fetchData: function() {
      if (!this.CI)
          return false;
      var metricEngine = new sn_cimaf.CIMetricEngine();
      var hasMetrics = false;
      this._sourceGr = this._sourceGr || this._getSourceGr();
      if (this._sourceGr) {
          this.startDate = this._metricWindowStartDate(this._sourceGr);
          this.endDate = this._metricWindowEndDate(this._sourceGr);
      }
      for (index in this.DEFINITION_IDS) {
          if (this.metricFetchType == "initial")
              this.DATA[this.DEFINITION_IDS[index]] = metricEngine.getLastMetric(this.CI, this.DEFINITION_IDS[index], this.startDate.getValue(), this.endDate.getValue());
          else if (this.metricFetchType == "recent")
              this.DATA[this.DEFINITION_IDS[index]] = metricEngine.getFirstMetric(this.CI, this.DEFINITION_IDS[index]);
          if (this.DATA[this.DEFINITION_IDS[index]])
              hasMetrics = true;
      }
      return hasMetrics;
  },

  _getMetricFetchWindowProp: function() {
      return gs.getProperty("sn_sow.initial_metric_fetch_window", 30);
  },

  _metricWindowEndDate: function(sourceGr) {
      var metricFetchWindow = this._getMetricFetchWindowProp();
      var incidentCreatedOn = sourceGr.getValue("sys_created_on");
      var endGdt = new GlideDateTime(incidentCreatedOn);
      endGdt.add(metricFetchWindow * 60 * 1000);
      return endGdt;
  },

  _metricWindowStartDate: function(sourceGr) {
      var metricFetchWindow = this._getMetricFetchWindowProp();
      var incidentCreatedOn = sourceGr.getValue("sys_created_on");
      var startGdt = new GlideDateTime(incidentCreatedOn);
      startGdt.add(metricFetchWindow * -1 * 60 * 1000);
      return startGdt;
  },

  _getSourceGr: function() {
      if (!this.SOURCE_TABLE)
          return null;
      var sourceGr = new GlideRecord(this.SOURCE_TABLE);
      if (sourceGr.get(this.SOURCE_RECORD_ID))
          return sourceGr;
      return null;
  },

  evaluateEmptyStateForSelectedCI: function(primaryCIClassSupported) {
      var metricEngine = new sn_cimaf.CIMetricEngine();
      //empty state for primary CI
      var result = {
          emptyStates: metricEngine.EMPTY_STATES
      };
      var adapterSupport;
      if (this.CI && this.metricFetchType == 'initial') {
          result.primaryCI = this.CI;
          adapterSupport = this.checkAdapterSupport(this.CI);
          if (adapterSupport[this.CI]) {
              result.metricFetchWindow = this._getMetricFetchWindowProp();
              result.emptyState = metricEngine.EMPTY_STATES.NO_INITIAL_METRICS;
              return result;
          }
          result.emptyState = adapterSupport.reason;
          return result;
      }
      // empty state for CI selected
      else if (this.CI && this.metricFetchType == 'recent') {
          adapterSupport = this.checkAdapterSupport(this.CI);
          if (!adapterSupport[this.CI]) {
              result.emptyState = adapterSupport.reason;
              return result;
          }
          var ciStatus = this.checkCIStatus(this.CI);
          if (!ciStatus.status) {
              result.emptyState = metricEngine.EMPTY_STATES.CI_OFFLINE;
              result.offlineMessage = ciStatus.message;
              return result;
          }
          result.emptyState = metricEngine.EMPTY_STATES.NO_RECENT_METRICS;
          return result;
      } else {
          if (this._countAffectedCIs(this.SOURCE_RECORD_ID) == 0) {
              result.emptyState = metricEngine.EMPTY_STATES.NO_CI_ASSOCIATED;
              return result;
          }
          if (!this._getPrimaryCI().value || primaryCIClassSupported == false)
              result.emptyState = metricEngine.EMPTY_STATES.NO_PRIMARY_CI;
          if (!this.checkForCIClasses(this.SOURCE_RECORD_ID))
              result.emptyState = metricEngine.EMPTY_STATES.NO_SUPPORTED_CI;
          return result;
      }
  },

  checkForCIClasses: function(parentSysId) {
      var ga = new GlideAggregate('task_ci');
      ga.addQuery('task', parentSysId);
      ga.addEncodedQuery('ci_item.sys_class_nameINSTANCEOFcmdb_ci_computer');
      ga.addAggregate('COUNT');
      ga.query();
      if (ga.next())
          return ga.getAggregate('COUNT') > 0;
      return false;
  },

  checkAdapterSupport: function(CISysId) {
      var metricEngine = new sn_cimaf.CIMetricEngine();
      var adapterApplicableResult = metricEngine.hasApplicableAdapter(CISysId, this.DEFINITION_IDS);
      var result = {};
      result[CISysId] = false;
      for (metricDefId in adapterApplicableResult) {
          if (adapterApplicableResult[metricDefId].adapterConfigGr) {
              result[CISysId] = true;
              break;
          }
      }
      if (!result[CISysId]) {
          for (metricDefId in adapterApplicableResult) {
              if (!adapterApplicableResult[metricDefId].adapterConfigGr) {
                  result.reason = adapterApplicableResult[metricDefId].reason;
                  break;
              }
          }
      }
      return result;
  },

  checkCIStatus: function(CISysId) {
      var metricEngine = new sn_cimaf.CIMetricEngine();
      return metricEngine.getCIStatus(CISysId);
  },

  _getPrimaryCI: function() {
      if (this.primaryCI) {
          return this.primaryCI;
      }
      this._sourceGr = this._sourceGr || this._getSourceGr();
      if (this._sourceGr) {
          return {
              value: this._sourceGr.getValue("cmdb_ci"),
              displayValue: this._sourceGr.getDisplayValue("cmdb_ci")
          };
      }
      return {};
  },

  _isClassSupported: function(ciSysId) {
      var ciGr = new GlideRecord('cmdb_ci');
      if (ciGr.get(ciSysId)) {
          if (ciGr.sys_class_name == 'cmdb_ci_computer')
              return true;
          var table = new GlideTableHierarchy('cmdb_ci_computer');
          var classes = table.getTableExtensions();
          for (var index in classes) {
              if (ciGr.sys_class_name == classes[index])
                  return true;
          }
      }
      return false;
  },

  _getSelectedCI: function(parentSysId, ciSysId) {
      var gr = new GlideRecord("task_ci");
      gr.addQuery("ci_item", ciSysId);
      gr.addQuery("task", parentSysId);
      gr.setLimit(1);
      gr.query();
      if (gr.next()) {
          return {
              value: gr.getValue("ci_item"),
              displayValue: gr.getDisplayValue("ci_item"),
          };
      }
      return;
  },

  _countAffectedCIs: function(parentSysId) {
      var ga = new GlideAggregate('task_ci');
      ga.addQuery('task', parentSysId);
      ga.addAggregate('COUNT');
      ga.query();
      if (ga.next())
          return ga.getAggregate('COUNT');
      return 0;
  },

  searchResultForCI: function(selectedCI, searchText, primaryCIClassSupported) {
      var output = {
          "options": [{
              "label": gs.getMessage("Only laptops and servers can be investigated"),
              "children": []
          }],
          "primaryCI": "",
          "selectedCI": ""
      };
      var primaryCI = this._getPrimaryCI();
      if (primaryCIClassSupported == undefined)
          output["primaryCIClassSupported"] = this._isClassSupported(primaryCI.value);
      else
          output["primaryCIClassSupported"] = primaryCIClassSupported;
      var gr = new GlideRecord("task_ci");
      gr.addQuery('task', this.SOURCE_RECORD_ID);
      if (searchText && searchText != '')
          gr.addQuery("ci_item.nameLIKE" + searchText);
      gr.addEncodedQuery('ci_item.sys_class_nameINSTANCEOFcmdb_ci_computer');
      gr.orderBy('ci_item.name');
      gr.setLimit(5);
      gr.query();
      while (gr.next()) {
          var ci = gr.getValue('ci_item');
          var isPrimaryCI = false;
          if (output["primaryCIClassSupported"] && !output["primaryCI"] && ci == primaryCI.value) {
              isPrimaryCI = true;
              output["primaryCI"] = ci;
          }
          if (!output["selectedCI"] && ci == selectedCI)
              output["selectedCI"] = ci;
          output.options[0].children.push({
              "primaryCI": isPrimaryCI,
              "id": ci,
              "label": isPrimaryCI ? gs.getMessage("{0} (Primary CI)", gr.getDisplayValue('ci_item')) : gr.getDisplayValue('ci_item'),
              "disabled": false
          });
      }
      if (selectedCI && !output['selectedCI'] && (primaryCI.value != selectedCI)) {
          var CISelected = this._getSelectedCI(this.SOURCE_RECORD_ID, selectedCI);
          if (CISelected) {
              output.options[0].children.push({
                  "primaryCI": false,
                  "id": CISelected.value,
                  "label": CISelected.displayValue,
                  "disabled": false
              });
              output["selectedCI"] = CISelected.value;
          }
      } else if (primaryCI.value && !output["primaryCI"] && output["primaryCIClassSupported"]) {
          output.options[0].children.push({
              "primaryCI": true,
              "id": primaryCI.value,
              "label": gs.getMessage("{0} (Primary CI)", primaryCI.displayValue),
              "disabled": false
          });
          output["primaryCI"] = primaryCI.value;
      }
      return output;
  },

  submitMetricFetchRequest: function() {
      var metricEngine = new sn_cimaf.CIMetricEngine();
      var definitionIds = this.DEFINITION_IDS.join();
      if (definitionIds) {
          var batchIdMap = metricEngine.requestMetrics(this.CI, definitionIds);
      }
      return batchIdMap;
  },

  buildDataForUI: function(checkCIStatus) {
      for (var i = 0; i < this.DEFINITION_IDS.length; i++) {
          var data = this.DATA[this.DEFINITION_IDS[i]];
          this.transformData(this.DEFINITION_IDS[i], data);
      }
      this.RESULT.definitionGroupData.config = this.definitionGroupConfig;
      this.setUIMessage(checkCIStatus);
      return this.RESULT;
  },

  transformData: function(metricDefId, data) {
      if (data && data.payload) {
          switch (this.DEFINITION_CONFIG[metricDefId].UI_TYPE) {
              case this.UI_TYPES.OVERVIEW:
                  this._formatDataForOverviewUI(metricDefId, data);
                  break;

              case this.UI_TYPES.VISUALIZATION:
                  this._formatDataForVisualizationUI(metricDefId, data);
                  break;

              case this.UI_TYPES.TABULAR:
                  this._formatDataForTabularUI(metricDefId, data, this.DATA);
                  break;
          }
      }
  },

  setUIMessage: function(checkCIStatus) {
      if (this.metricFetchType == "initial") {
          this._sourceGr = this._sourceGr || this._getSourceGr();
          if (this._sourceGr) {
              var table = this._sourceGr.getClassDisplayValue().toLowerCase();
              var timeFormat = this.investigateConfig.getLoggedInUserTimeFormat();
              var startTime = this.startDate.getLocalTime().getByFormat(timeFormat);
              var endTime = this.endDate.getLocalTime().getByFormat(timeFormat);
              var sourceRecordCreated = this._sourceGr.getDisplayValue("sys_created_on");

              this.RESULT.uiMessage = {
                  showMessage: true,
                  header: gs.getMessage("Initial metrics"),
                  message: gs.getMessage("You're viewing metrics captured around {0} creation ({1}), between {2} - {3}.", [table, sourceRecordCreated, startTime, endTime]),
                  icon: "circle-info-outline"
              };
          }
      } else if (checkCIStatus && this.metricFetchType == "recent") {
          var metricEngine = new sn_cimaf.CIMetricEngine();
          var ciStatus = metricEngine.getCIStatus(this.CI);
          if (!ciStatus.status) {
              this.RESULT.uiMessage = {
                  showMessage: true,
                  type: "critical",
                  header: "",
                  message: ciStatus.message,
                  icon: "circle-info-outline"
              };
          }
          this.RESULT.ciStatus = ciStatus;
      }

      return;
  },

  isPartOfDefinitionGroupConfig: function(metricDefinitionId) {
      return this.definitionGroupConfig && this.definitionGroupConfig.definition_ids.indexOf(metricDefinitionId) != -1;
  },

  _formatDataForOverviewUI: function(definitionId, metricData) {
      this.RESULT.overview.fetchTime = metricData.timestamp.displayValue;

      if (Object.keys(metricData).length === 0) {
          return;
      }

      var data = this.buildDataForOverviewUI(definitionId, metricData);
      this.RESULT.overview.data = this.arrayUtil.concat(this.RESULT.overview.data, data);
      return;
  },

  buildDataForOverviewUI: function(definitionId, metricData) {
      var data = [];
      var definitionConfig = this.DEFINITION_CONFIG[definitionId];
      Object.keys(definitionConfig.ATTRIBUTES).forEach(function(attr) {
          var value = metricData.payload[attr];
          if (value) {
              data.push({
                  'label': this.DEFINITION_CONFIG[definitionId].ATTRIBUTES[attr],
                  'value': {
                      "type": "string",
                      "value": metricData.payload[attr]
                  }
              });
          }
      }.bind(this));
      return data;
  },

  _formatDataForVisualizationUI: function(definitionId, metricData) {
      var definitionConfig = this.DEFINITION_CONFIG[definitionId];
      var result = {
          data: [],
          definitionId: definitionId,
          header: definitionConfig.HEADER
      };

      result.data = this.buildDataForVisualizationUI(definitionId, metricData);

      if (result.data.length > 0) {
          if (this.isPartOfDefinitionGroupConfig(definitionId)) {
              this.RESULT.definitionGroupData.visualization.push(result);
              this.RESULT.definitionGroupData.hideSection = false;
          } else {
              this.RESULT.visualization.push(result);
          }
      }
      return;
  },

  buildDataForVisualizationUI: function(definitionId, metricData) {
      var definitionConfig = this.DEFINITION_CONFIG[definitionId];
      var calculatedAttr = definitionConfig["CALCULATED_FIELDS"];
      var data = [];
      Object.keys(definitionConfig.ATTRIBUTES).forEach(function(col) {
          var getAttrValue = calculatedAttr[col];
          var dataVal = getAttrValue && typeof getAttrValue === "function" ? getAttrValue(metricData.payload) : metricData.payload[col];
          var header = definitionConfig.ATTRIBUTES[col];
          var value = typeof dataVal == 'object' ? dataVal.value : dataVal;
          if (value) {
              data.push({
                  'header': header,
                  'value': value,
                  'threshold': typeof dataVal == 'object' ? dataVal.threshold : '',
                  'fetchTime': metricData.timestamp.displayValue
              });
          }
      }.bind(this));
      return data;
  },

  buildDataForScatterPlot: function(definitionId, metrics) {
      var definitionConfig = this.DEFINITION_CONFIG[definitionId];
      var calculatedAttr = definitionConfig["CALCULATED_FIELDS"];
      var data = [];
      var map = {};
      for (var i = 0; i < metrics.data.length; i++) {
          metricData = metrics.data[i];
          var timeStamp = new GlideDateTime(metricData.timestamp.value).getNumericValue().toString();
          Object.keys(definitionConfig.ATTRIBUTES).forEach(function(col) {
              var getAttrValue = calculatedAttr[col];
              var dataVal = getAttrValue && typeof getAttrValue === "function" ? getAttrValue(metricData.payload) : metricData.payload[col];
              var header = definitionConfig.ATTRIBUTES[col];
              var value = typeof dataVal == 'object' ? dataVal.value : dataVal;
              if (value && this.ATTRIBUTES_FOR_VISUALIZATION_HISTORY[col]) {
                  if (map[header])
                      map[header].push({
                          "timestamp": timeStamp,
                          "value": Number(value.slice(0, -1))
                      });
                  else
                      map[header] = [{
                          "timestamp": timeStamp,
                          "value": Number(value.slice(0, -1))
                      }];
              }
          }.bind(this));
      }
      Object.keys(map).forEach(function(attribute) {
          var formattedObject = {
              "data": map[attribute],
              "metadata": {
                  "series": [{
                      "label": attribute,
                      "id": "value",
                      "type": "value"
                  }],
                  "aggregate": {
                      "fieldType": "decimal"
                  },
                  "format": {
                      "unitFormat": "{0}%",
                      "frequency": "daily",
                      "precision": 0
                  }
              }
          };
          data.push(formattedObject);
      });
      return data;
  },

  _formatDataForTabularUI: function(definitionId, metricData, completeMetricData) {
      var definitionConfig = this.DEFINITION_CONFIG[definitionId];
      var items = definitionConfig["ITEMS"];

      if (!(Array.isArray(metricData.payload) && metricData.payload.length > 0)) {
          return;
      }
      var remedialActionEngine = new sn_reacf.RemedialActionEngine();
      var sourceGr = this._getSourceGr();
      var isSourceGrActive = sourceGr && sourceGr.getValue("active") == "1";
      for (var i = 0; i < items.length; i++) {
          var result = {
              data: {
                  columns: [],
                  rowData: []
              },
              definitionId: definitionId,
              header: items[i].HEADER,
              count: 0,
              key: items[i]["KEY"],
              action: [],
              fetchTime: metricData.timestamp.displayValue
          };

          result.data = this.buildDataForTabularUI(items[i], metricData, completeMetricData);
          var count = result.data.rowData.length;

          if (count == 0) {
              continue;
          } else {
              var getCount = items[i].hasOwnProperty("CALCULATED_FIELDS") && items[i]["CALCULATED_FIELDS"]["getCount"];

              result.showEmptyState = false;
              result.count = typeof getCount == 'function' ? getCount(metricData.payload) : count;
              result.pagination = items[i].PAGINATION;
              result.collapsible = items[i].COLLAPSIBLE;
              var actions = items[i]["ACTIONS"];
              if (isSourceGrActive) {
                  for (var j = 0; j < actions.length; j++) {
                      var remedialActionInternalName = actions[j]["internalName"];
                      if (remedialActionEngine.isApplicable(remedialActionInternalName, this.CI)) {
                          actions[j].isVisible = remedialActionEngine.isAuthorized(remedialActionInternalName);
                          result.action.push(actions[j]);
                      }
                  }
              }
          }

          if (this.isPartOfDefinitionGroupConfig(definitionId)) {
              this.RESULT.definitionGroupData.tabular.push(result);
              this.RESULT.definitionGroupData.hideSection = false;
          } else {
              this.RESULT.tabular.push(result);
          }
      }
      return;
  },

  buildDataForTabularUI: function(definitionConfig, metricData, completeMetricData) {
      var data = {
          columns: [],
          rowData: []
      };

      var getRowData = definitionConfig.hasOwnProperty("CALCULATED_FIELDS") && definitionConfig["CALCULATED_FIELDS"]["rowData"];
      var rowData = getRowData && typeof getRowData === "function" ? getRowData(metricData.payload, completeMetricData) : metricData.payload;
      if (rowData.length > 0) {
          Object.keys(definitionConfig.ATTRIBUTES).forEach(function(col) {
              var hideColumn = true;
              var isRowSelectable = this.SOURCE_PAGE == "investigate" ? (col == "selectable" && definitionConfig.ATTRIBUTES[col]) : false;
              for (var i = 0; i < rowData.length; i++) {
                  if (!gs.nil(rowData[i][col]) || isRowSelectable) {
                      hideColumn = false;
                      break;
                  }
              }
              if (!hideColumn) {
                  if (isRowSelectable) {
                      data.columns.push({
                          "field": "row_selector",
                          "type": "row_selector",
                          "title": ""
                      });
                  } else {
                      data.columns.push({
                          "field": col,
                          "type": 'string',
                          "title": typeof definitionConfig.ATTRIBUTES[col] == "object" ? definitionConfig.ATTRIBUTES[col].label : definitionConfig.ATTRIBUTES[col]
                      });
                  }
              }
          }.bind(this));
      }

      for (var i = 0; i < rowData.length; i++) {

          data.columns.forEach(function(col) {
              var value = rowData[i][col.field];
              var threshold = rowData[i].threshold;

              if (threshold && threshold.columnName == col.field) {
                  rowData[i][col.field] = this.getCellValueWithThresholdIcon(value, threshold);
              } else if (col.field == "row_selector") {
                  rowData[i][col.field] = {};
                  rowData[i][col.field]["clickable"] = true;
                  rowData[i][col.field]["value"] = "";
                  rowData[i][col.field]["displayValue"] = "";
                  rowData[i][col.field]["components"] = [{
                      "name": "now-checkbox",
                      "properties": {
                          "checked": false,
                          "readonly": false,
                          "title" : gs.getMessage("Select this record"),
                          "configAria" : {
                              "aria-label" : gs.getMessage("Select this record")
                          },
                      }
                  }];

                  rowData[i][col.field]["payload"] = {
                      "uniqueId": gs.generateGUID()
                  };
              } else {
                  rowData[i][col.field] = {};
                  rowData[i][col.field]["clickable"] = false;
                  rowData[i][col.field]["value"] = !gs.nil(value) ? value : "";
                  rowData[i][col.field]["displayValue"] = !gs.nil(value) ? value : gs.getMessage("(empty)");
                  rowData[i][col.field]["components"] = [{
                      "name": "now-stylized-text",
                      "properties": {
                          "css": "* {\n font-size: 16px; min-width: 100%; max-width: 100%;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n display: inline-block;\n vertical-align: middle;\n}",
                          "text": value,
                          "tag": "div",
                          "style": {
                              "padding-left": "10px",
                              "white-space": "nowrap",
                              "overflow": "hidden",
                              "text-overflow": "ellipsis"
                          }
                      }
                  }];


              }
          }.bind(this));
      }
      data.rowData = rowData;
      return data;
  },

  fetchDataForSystemOverview: function(ci) {
      var result = [];
      var fieldNames = new SOWInvestigateConfig().getSystemOverviewAttributes();
      var gr = new GlideRecord("cmdb_ci_computer");
      if (gr.get(ci)) {
          for (index in fieldNames) {
              var value = gr[fieldNames[index]].getDisplayValue();
              if (value) {
                  var labelValuePair = {
                      "label": gr[fieldNames[index]].getLabel(),
                      "value": {
                          "value": value,
                          "type": "string"
                      }
                  };
                  result.push(labelValuePair);
              }
          }
      }

      //Make 1st element as link that would open CI record
      if (result.length > 0) {
          result[0].value.type = "text-link";
          result[0].value.href = "javascript:void(0)";
          result[0].value.label = result[0].value.value;
      }
      return result;
  },

  getCellValueWithThresholdIcon: function(value, threshold) {
      var result = {
          "displayValue": value,
          "value": value,
          "clickable": false,
          "components": []
      };
      if (threshold.critical) {
          var criticalIconComponent = {
              "name": "now-icon",
              "properties": {
                  "icon": "circle-exclamation-fill",
                  "size": "sm",
                  "style": {
                      "width": "auto",
                      "color": "rgb(var(--now-color_alert--critical-4))",
                      "padding-left": "4px",
                      "padding-right": "4px"
                  }
              }
          };
          result.components.push(criticalIconComponent);
      }

      result.components.push({
          "name": "now-stylized-text",
          "properties": {
              "css": "* {\n font-size: 16px; max-width: 100px;\n text-overflow: ellipsis;\n overflow: hidden;\n}",
              "text": value,
              "tag": "div",
              "style": threshold.critical ? null : {
                  "padding-left": "20px"
              }
          }
      });
      return result;
  },

  systemInfoDisplayCheck: function(ci) {

      var msinfo32_metric_definition = this.investigateConfig.DEFINITION_CONFIG_MAP.SYSTEM_INFO_MSINFO32;
      var dsregcmd_metric_definition = this.investigateConfig.DEFINITION_CONFIG_MAP.SYSTEM_INFO_DSREGCMD;
      var metricEngine = new sn_cimaf.CIMetricEngine();

      //check if adapter is present for one of the metrics
      if (metricEngine.getAdapter(msinfo32_metric_definition, ci)) {
          return true;
      }

      if (metricEngine.getAdapter(dsregcmd_metric_definition, ci)) {
          return true;
      }

      return false;
  },
  
  getRemedialActionExecutionData: function(table, record, maxLimit) {
      var remedialData = [];
      var gr = new GlideRecord("sn_reacf_remedial_action_execution");
      gr.addQuery("parent_record_table", table);
      gr.addQuery("parent_record_id", record);
      gr.addQuery("origin", this.investigateConfig.SERVICE_OPERATIONS_WORKSPACE_ORIGIN_RECORD);
      gr.orderByDesc("sys_created_on");
      gr.setLimit(maxLimit);
      gr.query();
      while (gr.next()) {
          remedialData.push({
              "sys_id": {
                  "displayValue": gr.getDisplayValue("sys_id"),
                  "value": gr.getValue("sys_id")
              },
              "remedial_action": {
                  "displayValue": gr.getDisplayValue("remedial_action"),
                  "value": gr.getValue("remedial_action")
              },
              "sys_created_on": {
                  "displayValue": gr.getDisplayValue("sys_created_on"),
                  "value": gr.getValue("sys_created_on")
              },
              "state": {
                  "displayValue": gr.getDisplayValue("state"),
                  "value": gr.getValue("state")
              },
              "target_record_id": {
                  "displayValue": gr.getDisplayValue("target_record_id"),
                  "value": gr.getValue("target_record_id")
              },
          });
      }
      var remedialDataObj = {
          "data": remedialData
      };
      return remedialDataObj;
  },

  type: 'SOWInvestigateUtils'
};

Sys ID

8effd540531301103eacddeeff7b121c

Offical Documentation

Official Docs: