예제 #1
0
    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")
예제 #2
0
    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)