def _renderSvgBasedViz(self, pdfRenderer, view, props, mode): # set the fetch option output_mode to 'json_cols' # this will cause the data returned by getFeed to be # pre-populated into the columnar form that the charting code wants # set the fetch option time_format to '%FT%T.%Q%:z' # this is the only time format that is accepted by charting # set the show_metadata flag to true for chart mode only # this will populate the metadata for each field, which certain chart types need to render correctly if mode == "chart": view.getSearchJobObj().setFetchOptions(output_mode="json_cols", time_format="%FT%T.%Q%:z", show_metadata="true") elif mode == "single": view.getSearchJobObj().setFetchOptions(output_mode="json_cols", time_format="%FT%T.%Q%:z", count=1000) else: view.getSearchJobObj().setFetchOptions(output_mode="json_cols", time_format="%FT%T.%Q%:z") feedCount = DEFAULT_FEED_COUNT if 'data.count' in props: feedCount = props['data.count'] feed = toDefaultStrings(view.getSearchJobFeed(feedCount=feedCount)) logger.debug("_renderSvgBasedViz> feed: " + str(feed) + ", " + str(type(feed))) if feed is None or len(feed.strip()) == 0: logger.warning("_renderSvgBasedViz> feed: " + str(feed) + ", " + str(type(feed))) pdfRenderer.renderText("No results found.") return feed = json.loads(feed) # extract columns and fields from the search results data = feed['columns'] fields = feed['fields'] if len(data) == 0: pdfRenderer.renderText("No results found.") return # set up the SVG viz object svgBasedViz = None if mode == "chart": # SPL-118166 - remove 'None' values from the '_time' column. if len(fields) and fields[0].get('name') == '_time': data[0] = list(filter(lambda x: x is not None, data[0])) svgBasedViz = pc.Chart(data, fields, props, self._locale, server_zoneinfo=self._server_zoneinfo) elif mode == "map": svgBasedViz = pc.Map(data, fields, props, self._locale, server_zoneinfo=self._server_zoneinfo) elif mode == "single": svgBasedViz = pc.Single(data, fields, props, self._locale, server_zoneinfo=self._server_zoneinfo) # build the SVG viz buildSuccess = svgBasedViz.build() if buildSuccess: svgString = svgBasedViz.getSvg() pdfRenderer.renderSvgString(svgString, title=None) else: logger.error("SVG based viz building error")
def _initParameters(self): self._owner = self.request['userName'] # SPL-107168 Need to populate namespace & owner beforehand which are needed # to generate context specific URI while initializing conf defaults # get namespace/owner self._namespace = self.args.get(self.ARG_INPUT_NAMESPACE) if self.ARG_INPUT_OWNER in self.args: self._owner = self.args.get(self.ARG_INPUT_OWNER) self._initArgs() self._initWebDefaults() self._initLimitsDefaults() self._initAlertActionsDefaults() # initialize view type # the order matters, check dashboard xml first if self.ARG_INPUT_DASHBOARD_XML in self.args: self._dashboardXml = unquote( self.args.get(self.ARG_INPUT_DASHBOARD_XML)) self._viewType = self.VIEW_TYPE_DASHBOARD self._dashboardName = self.args.get(self.ARG_INPUT_DASHBOARD) logger.debug("pdfgen/render xml=%s" % self._dashboardXml) elif self.ARG_INPUT_DASHBOARD in self.args: self._dashboardName = self.args.get(self.ARG_INPUT_DASHBOARD) self._viewType = self.VIEW_TYPE_DASHBOARD elif self.ARG_INPUT_REPORT in self.args: self._reportName = self.args.get(self.ARG_INPUT_REPORT) self._viewType = self.VIEW_TYPE_REPORT elif self.ARG_INPUT_SEARCH in self.args: self._searchStr = self.args.get(self.ARG_INPUT_SEARCH, "No search query specified") self._et = self.args.get(self.ARG_INPUT_ET, 0) self._lt = self.args.get(self.ARG_INPUT_LT, '') # if et or lt is 0.000 change it to 0 if float(self._et) == 0.0: logger.debug("_et was %s, updating it to '0'" % self._et) self._et = '0' if self._lt and float(self._lt) == 0.0: logger.debug("_lt was %s, updating it to '0'" % self._lt) self._lt = '0' self._reportName = 'Splunk search results' self._viewType = self.VIEW_TYPE_SEARCH # initialize papersize if self.ARG_INPUT_PAPERSIZE in self.args: paperSizeArg = self.args.get(self.ARG_INPUT_PAPERSIZE).lower() if paperSizeArg in pdfrenderer.PAPERSIZES: self._paperSize = paperSizeArg else: logger.warn('Invalid paper size "%s"' % paperSizeArg) raise ArgError( "Paper size is not valid. Please check the pdfgen.log file for more information." ) logger.debug("pdf-init paper-size=%s" % self._paperSize) # initialize include-splunk-logo self._includeSplunkLogo = normalizeBoolean( self.args.get(self.ARG_INPUT_INCLUDE_SPLUNK_LOGO, self._includeSplunkLogo)) logger.debug("pdf-init include-splunk-logo=%s" % self._includeSplunkLogo) # initialize max-row-per-table if self.ARG_INPUT_MAX_ROWS_PER_TABLE in self.args: maxRowsPerTableArg = self.args.get( self.ARG_INPUT_MAX_ROWS_PER_TABLE) try: self._maxRowsPerTable = int(maxRowsPerTableArg) except: logger.warn( 'Max-rows-per-table="%s" is invalid, must be an integer' % maxRowsPerTableArg) raise ArgError( "max-rows-per-table is invalid, must be an integer. Please check the pdfgen.log file for more information." ) logger.debug("pdf-init max-rows-per-table=%s" % (str(self._maxRowsPerTable))) # initialize timeout if self.ARG_INPUT_TIMEOUT in self.args: self._timeoutDuration = int(self.args.get(self.ARG_INPUT_TIMEOUT)) logger.debug("pdf-init timeoutDuration=%s" % self._timeoutDuration) self._startTimeoutClock() if self.ARG_INPUT_REPORT_FILE_NAME in self.args: self._fileNamePattern = self.args.get( self.ARG_INPUT_REPORT_FILE_NAME) logger.debug("pdf-init report-file-name=%s" % self._fileNamePattern) # initialize time of report self._initTimeOfReport() # check for SIDs if self._viewType is self.VIEW_TYPE_REPORT: if self.ARG_INPUT_SID in self.args: self._inputSids[0] = self.args.get(self.ARG_INPUT_SID) else: for argK, argV in self.args.items(): if self.ARG_INPUT_SID in argK: # we want the panel sequence number which is retrieved from "sid_<seqNum>" match = self.sidRE.match(argK) if match != None and len(match.groups(0)) > 0: seqNum = match.groups(0)[0] if len(seqNum) > 0: self._inputSids[int(seqNum)] = argV logger.debug("sid seqNum=%s value=%s" % (seqNum, argV)) # allow override from http arguments for validArgs in pdfrenderer.ALL_PDF_SETTINGS: v = self.args.get(validArgs) or self._pdfSettings.get(validArgs) if v is not None: v = v.strip() # SPL-98329 convert value into lowercase except logo path if validArgs != pdfrenderer.SETTING_LOGO_PATH: v = v.lower() if validArgs in pdfrenderer.PDF_BOOLEAN_SETTINGS: self._pdfSettings[validArgs] = normalizeBoolean(v) else: self._pdfSettings[validArgs] = v logger.debug("pdfSettings=%s" % (str(self._pdfSettings))) self._validateParameters() self._timestampStr = splunk.search.searchUtils.getFormattedTimeForUser( self.sessionKey, now=self._now, timeFormat='%F %T %Z') self._locale = self.args.get(self.ARG_INPUT_LOCALE) logger.info("pdf-init locale=%s" % self._locale) self._server_zoneinfo = self.args.get(self.ARG_INPUT_TIMEZONE) if self._server_zoneinfo is None: self._server_zoneinfo = toDefaultStrings( rest.simpleRequest('/services/search/timeparser/tz', sessionKey=self.sessionKey)[1]) logger.info("pdf-init server_zoneinfo=%s" % self._server_zoneinfo)