Skip to main content
Sisense Community logo
  • Community Feedback
  • Chapters
  • Events
  • Forums
    • Help and How To
    • Product Feedback Forum
    • Strategy & Use Cases
  • Blogs
  • KB Docs
    • KB Docs
    • Add-Ons & Plug-Ins
    • APIs
    • Best Practices
    • Blox
    • CDT
    • Cloud Managed Service
    • Data Models
    • Data Sources
    • Embedding Analytics
    • How-Tos & FAQs
    • Onboarding
    • PySisense
    • Security
    • Sisense Administration
    • Sisense Intelligence & AI
    • Troubleshooting
    • Widget & Dashboard Scripts
  • Support
  • Learning
    • Sisense Academy: Free Courses and Certifications
    • Official Developer Documentation
    • Official Product Documentation
    • Official Sisense Youtube Channel
    • Sisense Compose SDK Playground
  • Use Case Gallery
All PostsDiscussionsBlogsIdeasQuestions
Leaderboards
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
Discussions
  • TagsChevronRightIcon
How-To
    • TroubleshootingChevronRightIcon

    After a server reboot, connectors hosted by Sisense.CLRConnectorsContainer stop working with Event ID 7000 / 7006 [Windows]

                                             

    Introduction: After a Windows server reboot, the Sisense.CLRConnectorsContainer service fails to start (Windows Event 7000 / 7006), so its connectors (e.g. Microsoft SQL Server) stop working — causing build failures, Live dashboard errors, and connectors missing when adding tables. This guide resolves it by extending ServicesPipeTimeout. Applies to Sisense on Windows (on-prem), all versions. Step-by-Step Guide: Customers usually notice this issue through one or more of the following symptoms after a server reboot: ElastiCube builds fail on cubes that use a CLR-hosted connector. Dashboards using Live data models return errors, because live queries cannot reach the connector. When adding a new table to a data model, the connector does not appear in the list and cannot be selected. The root cause is that the Sisense.CLRConnectorsContainer service failed to start during server startup. In the Windows Event Viewer (Windows Logs → System), you will find events such as: Event ID 7000 — "The Sisense.CLRConnectorsContainer service failed to start due to the following error: The service did not respond to the start or control request in a timely fashion." Event ID 7006 — "A timeout was reached (30000 milliseconds) while waiting for the Sisense.CLRConnectorsContainer service to connect." The Windows Service Control Manager (SCM) requires each service to respond within a default window of 30 seconds (30000 ms), controlled by the registry value ServicesPipeTimeout . After a reboot, all services start at once and compete for CPU and disk I/O; combined with the CLR container initializing many connectors, the default window is often exceeded, the service times out, and its connectors become unavailable. Resolution — extend the SCM service start timeout This value applies server-wide (to all services). Caution : Editing the registry affects the entire system. Back up the target key first and, where possible, perform the change during a maintenance window. Administrator privileges are required. Log on to the server with administrator privileges. Launch regedit (Registry Editor) as administrator. Navigate to the following key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control (registry path) Check whether a DWORD value named ServicesPipeTimeout exists in the right pane. If it does not exist, right-click the empty area → New → DWORD (32-bit) Value, and name it ServicesPipeTimeout. Double-click ServicesPipeTimeout to open it. Set the Base to Decimal . Enter the extended timeout in milliseconds. Recommended: 180000 (180 seconds). For environments with longer startup times, increase up to 300000 (300 seconds). Click OK to save. Restart the server to apply the change ( the SCM reads ServicesPipeTimeout only after a reboot ). After the restart, confirm that Sisense.CLRConnectorsContainer starts successfully and that Event 7000 / 7006 no longer recur. Optional — mitigate via startup order (can be combined) If services contend during a simultaneous startup after a reboot, set non-core services to Automatic (Delayed Start) so foundational services (Mongo, Zookeeper, RabbitMQ) start first, reducing the chance of a timeout. This works well combined with extending ServicesPipeTimeout. Conclusion: The Sisense.CLRConnectorsContainer failing to start after a reboot is caused by the Windows SCM default 30-second start timeout being exceeded under startup contention. Increasing the ServicesPipeTimeout registry value (e.g. to 180000 ms) and rebooting gives the service enough time to initialize, keeping its connectors available and preventing build failures, Live dashboard errors, and missing connectors. Setting non-core services to delayed start further reduces the risk. References/Related Content  Microsoft — A slow service does not start due to time-out error in Windows . Disclaimer : This post outlines a potential custom workaround for a specific use case or provides instructions regarding a specific task. The solution may not work in all scenarios or Sisense versions, so we strongly recommend testing it in your environment before deployment. If you need further assistance with this, please let us know.

    Eiji Ozawa
    Eiji OzawaPosted 1 month ago
    0
             
  • Discussion
    Mia Isaacson
    • Help and How-To
             
    Mia Isaacson
    Dashboard script: automatically reset filters to default when a dashboard is opened
                                             

    Hey everyone 👋 Here's one that comes up more than you'd think. You've got a dashboard with filters. A user applies a bunch of selections, and the next time they (or someone else) opens it, those filters are still there from the last session. Depending on your use case, that might be exactly what you want... but sometimes it isn't. If you'd rather your dashboard always open in a clean, predictable state, with filters resetting to the defaults you set at design time, this dashboard script does exactly that. Every time the dashboard is activated, it removes whatever filters are currently applied and restores the defaults automatically. Here's the full script: dashboard.on("activated", (e, args) => { const dashFilters = args.dashboard.filters; dashFilters.$$items = dashFilters.$$items.splice(0, dashFilters.$$items.length); let filters = args.dashboard.defaultFilters; var options = { save: true, refresh: true, unionIfSameDimensionAndSameType: false, }; if (!Array.isArray(filters)) { filters = [filters]; } dashFilters.update(filters, options); }); Here's what each part is doing: Trigger This fires whenever the dashboard becomes active (when a user opens it or navigates to it). That's the moment everything below kicks off. dashboard.on("activated", (e, args) => { ... }) Step 1: Clear the current filters This grabs the live filter collection and empties it out completely — whatever the user had applied before is gone. const dashFilters = args.dashboard.filters; dashFilters.$$items = dashFilters.$$items.splice(0, dashFilters.$$items.length); Step 2: Grab the default filters defaultFilters is the filter state saved at design time. Whatever you configured as the intended starting point when you built the dashboard. const filters = args.dashboard.defaultFilters; Step 3: Apply the defaults This normalizes the filters into an array, then applies them back with save: true so the reset persists, and refresh: true so the data reloads immediately. The unionIfSameDimensionAndSameType: false setting makes sure it replaces rather than tries to merge with anything. var options = { save: true, refresh: true, unionIfSameDimensionAndSameType: false, }; if (!Array.isArray(filters)) { filters = [filters]; } dashFilters.update(filters, options); When would you actually use this? Shared dashboards where you don't want one user's filter selections to carry over for the next person who opens it Executive or presentation dashboards where the default view is intentional and should always be what people land on Dashboards embedded in portals or apps where a consistent starting state matters Anywhere you've had someone complain that the dashboard "looks different than it usually does" — often it's just leftover filters from a previous session One thing worth knowing The $$items approach in Step 1 is manipulating an internal Sisense array directly. The $$ prefix is a convention for internal Angular properties. It works well, but it's worth keeping in mind that if Sisense changes the internal structure down the road, that line could break without much warning. Something to keep an eye on if you're on this script after an upgrade. Hope this is useful for someone, and happy to answer questions if you run into anything! Mia from QBeeQ, a Sisense Gold Implementation Partner www.qbeeq.io

    6 months ago
    0
             
  • Discussion
    Mia Isaacson
    • Help and How-To
             
    Mia Isaacson
    Widget script: hide value labels and empty legend items on native bar and column charts
                                                     

    Hey everyone 👋 Ever built a stacked bar or column chart and found yourself wishing you could just... turn the labels off? Maybe you've got a lot of segments, and they're all squishing together, or the chart just doesn't have quite enough room to breathe in your dashboard layout, and the labels end up overlapping and making things harder to read rather than easier. Or, does it bother you that your legend still shows entries for categories that have no data at all for certain dimension values? So you've got these ghost entries sitting in the legend that don't correspond to anything visible in the chart. Sisense doesn't have a native toggle for either of these, so here's a widget script that handles both. It works on bar and column charts (stacked or single value) and does two things: Hides the value labels from displaying on the bars or columns Removes any series from the legend if all of its values are null or zero widget.on("beforeviewloaded", function(w, args){ var allEmpty = arr => arr.every(v => v.y === null || v.y === 0); for (e in args.options.series) { var serie = args.options.series[e]; if (allEmpty(serie.data)) { serie.showInLegend = false; } } }); A few situations where this comes in handy: You have a stacked chart with a lot of segments where the labels are colliding with each other Your dashboard is on the tighter side, and there just isn't room to make the chart large enough for labels to display cleanly Your legend is cluttered with entries for categories that have no data for certain dimension values, which can confuse users into thinking something is missing The chart is more of a visual overview and the exact values aren't the point, users can always hover for tooltips anyway You just prefer a cleaner, less noisy look overall Nothing groundbreaking, just a handy little script if you've ever hit this wall.  Mia from QBeeQ, a Sisense Gold Implementation Partner www.qbeeq.io

    6 months ago
    0
             
  • Discussion
    Rose Holmes-Minton
    • Help and How-To
             
    Rose Holmes-Minton
    Set a background dashboard filter using Javascript
                             

    I am trying to set a background dashboard filter using JavaScript. Any suggestions?  

    8 months agolast reply 8 months ago
    3
             
  • Discussion
    BenWalkerRH
    • Help and How-To
             
    BenWalkerRH
    Dynamically changing colours on value labels
                             

    Does anyone know if this if possible either at a widget level AND/OR at a dashboard level? I've tried a bunch of scripts from ChatGPT but none that work as intended.  They either amend the colours but dont respect and changes being mad to rendering such as cell size changes and filters applied etc, or the reverse where it respects the rendering but not the colours changing.. 

    1 year agolast reply 11 months ago
    5
             
  • Discussion
    kamal123
    • Help and How-To
             
    kamal123
    Kamal Hinduja Swiss: How to use REST APIs to push data into Sisense?
                                     

    Hi All, I'm Kamal Hinduja, based in Geneva, Switzerland(Swiss) .  Can anyone explain in details How to use REST APIs to push data into Sisense? Thanks, Regards Kamal Hinduja Geneva, Switzerland  

    1 year agolast reply 1 year ago
    4
             
  • Question
    • Help and How-ToChevronRightIcon
                     
    Days between x and today
    hlister
    hlister
    Posted 1 year ago • Last reply 1 year ago
    3
             
  • Discussion
    Michalis Gregoriou
    • Help and How-To
             
    Michalis Gregoriou
    Webhooks on MS Teams
                     

    Hi Community, Has anyone managed to setup a Webhook on MS Teams? I am trying to set it up, but it doesn't seem to work... 

    1 year agolast reply 1 year ago
    3
             
    • Add-ons & Plug-InsChevronRightIcon

    Customizing the Sisense User Interface with Interactive Buttons and Icons

                                                                                                             

    Sisense plugins  and scripts enable extensive customization of the Sisense user interface, allowing developers to add interactive elements such as buttons and icons to enhance functionality and user experience. A common use case of plugins involves adding clickable icons or buttons that trigger specific plugin features or open custom UI elements. This article outlines the process for adding these interactive elements using a practical example.   Icon Example Key Steps for Adding Clickable Buttons Follow this general flow to successfully add a custom clickable buttons or icon into the Sisense UI: Choose the UI placement:  Determine the exact area of the Sisense UI where the button or icon will appear. Identify the target parent container:  Find the appropriate parent element in the DOM that will contain the new button. Prevent duplication:  Implement checks to avoid adding duplicate buttons, if Sisense dashboard or prism event used fires more than once. Create the HTML button element:  Construct the button programmatically and apply necessary styling, adding either button text or icon image. Attach Click Listener:  Use JavaScript event listeners to define the button or icon interactive behavior. Practical Example: Adding a Button to the Filter Header Below is a clear and reusable example demonstrating the process of adding a clickable button to the filters header in a Sisense dashboard. This can easily be adapted for different parts of the dashboard or various plugin functionalities.   function addCustomButton() { // Step 1: Locate the UI container (in this example, the header to the right hand filter panel) const filtersContainer = document.querySelector('.filters-headline'); // Step 2: Avoid duplicate button addition if (filtersContainer && !filtersContainer.querySelector('.custom-btn')) { // Identify placement context, in this example next to the spacer element to the right of the filters label const spacerElement = filtersContainer.querySelector('.spacer'); if (spacerElement) { // Step 3: Create the button with appropriate classes const customButton = document.createElement('button'); customButton.classList.add('btn', 'btn--icon', 'btn--dark', 'btn--on-grey', 'custom-btn'); // Insert an SVG icon (example provided) customButton.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="100" height="100" viewBox="0,0,256,256"> <g fill="#5b6372" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal"> <g transform="scale(8,8)"> <path d="M9,4c-1.64453,0 -3,1.35547 -3,3v18c0,1.64453 1.35547,3 3,3h17v-24zM9,6h3v11.41406l4,-4l4,4v-11.41406h4v16h-15c-0.35156,0 -0.68359,0.07422 -1,0.1875v-15.1875c0,-0.56641 0.43359,-1 1,-1zM14,6h4v6.58594l-2,-2l-2,2zM9,24h15v2h-15c-0.56641,0 -1,-0.43359 -1,-1c0,-0.56641 0.43359,-1 1,-1z"></path> </g> </g> </svg> `; = ` <!-- Your SVG icon here --> `; // Step 4: Define button functionality customButton.addEventListener('click', function () { // Replace with your plugin's custom action yourPlugin.action(); }); // Insert button into UI spacerElement.insertAdjacentElement('afterend', customButton); } } } // Add button upon dashboard load prism.on("dashboardloaded", function (e, args) { args.dashboard.on("widgetinitialized", addCustomButton); }); By following these principles and adapting the provided example, you can effectively enrich the Sisense interface, tailoring the UI to specific custom workflows and interactions.

    Jeremy Friedel
    Jeremy FriedelPosted 1 year ago
    0
             
  • Blog banner
    • Add-ons & Plug-InsChevronRightIcon

    Loading Amchart5 and Other External Libraries via Script Tags in Plugins

                                                                                                             

    This article explains how to load external libraries, such as Amchart5 , into Sisense plugins , such as plugins that create new custom widget visualization types, by dynamically adding script tags to the page header to load the library. This method can avoid potential issues associated with other loading techniques but also offers flexibility such as using an external CDN to reduce plugin size and file count. Previous articles  have discussed how to load external libraries and modules for Sisense plugins via adding the file to the plugin folder, and adding the file to the "source" parameter array in the plugin.json.   What Is a Script Tag?   A  script tag  is an HTML element (<script>) used to embed or reference JavaScript code in an HTML document. When you include a script tag with a src attribute, the browser downloads and executes the external JavaScript file.   Why Use Script Tags for Loading External Libraries? For certain JavaScript libraries, especially visualization libraries like Amchart5, loading the library via a script tag can help avoid issues that might arise from bundling the files directly into the plugin. The script tag method provides several benefits: Flexibility:  It allows the option of using an external CDN. This can reduce the size of the plugin package and the number of files you need to manage. Auto-Updating:  When using a CDN, the external library can be updated automatically without modifying the plugin. Self-Hosting Option:  Alternatively, you can set the src parameter to a local path of JavaScript files uploaded within the plugin, ensuring that the plugin remains fully self-hosted and independent of any CDN. Loading External Libraries: Self-Hosted or Using a CDN Self-Hosted:  The script’s src is set to point to the files within the plugin folder. This follows this very specific format: /plugins/${name_of_plugin_folder}/{Any_subfolders_if_needed}/{full_name_of_the_file} This approach makes the plugin self-contained and avoids external dependencies. The src path must follow this format. CDN-Hosted:  The src parameter is set to the URL of the external CDN, such as: https://cdn.amcharts.com/lib/5/xy.js Using a CDN can reduce the plugin’s file size and benefit from auto-updating libraries, though it introduces a dependency on the CDN’s availability. Example Loader Script Below is an example of a loader file (loader.6.js) that dynamically adds script tags to the page header to load Amchart5 and its modules (AM5 is loaded in this example, as well as additional AM5 modules dealing with axises and animation, this is a self-hosted example and does not rely on a CDN). // List of script URLs to add to the page header const scriptUrls = [ "/plugins/am5Example/am5/index.js", "/plugins/am5Example/am5/xy.js", "/plugins/am5Example/am5/themes/Animation.js" ]; // Function to add a script tag to the header function addScriptToHeader(url) { const script = document.createElement("script"); script.src=url; // Optionally set async or defer attributes if needed script.async = false; document.head.appendChild(script); } // Loop through each URL and add it to the header scriptUrls.forEach(url => addScriptToHeader(url));   This can be modified to occur on a specific prism and dashboard event, as opposed to immediately when the plugin loads. In this script: document.createElement("script"):  Creates a new script tag. script.src:  Specifies the source of the JavaScript file. document.head.appendChild(script):  Adds the script tag to the Sisense page header. The async attribute is set to false to ensure that scripts load in the order they are added. Configuring plugin.json In your plugin’s plugin.json, reference the loader file and the library file itself. The loader file then adds the necessary external scripts. An example plugin.json configuration is shown below: { "name": "am5Example", "pluginInfraVersion": 2, "isEnabled": true, "source": [ "am5/loader.6.js" ], "folderName": "am5Example", "version": "1.0.0" } This setup makes the external library (Amchart5, in this case) available to your plugin without bundling the entire library directly into the main codebase. Conclusion Using script tags to load external libraries like Amchart5 provides a flexible method for managing dependencies in Sisense plugins. Whether the libraries are self-hosted or rely on an external CDN, this method simplifies the management of external scripts and can lead to more efficient plugin development, and avoid issues with specific libraries such as Amchart5 that work best when loaded as a script element. The example plugin that demonstrates this type of loading is available for download below.    

    Jeremy Friedel
    Jeremy FriedelPosted 1 year ago • Last reply 1 year ago
    1