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
      • Official Sisense Discord
    • Use Case Gallery
    Discussions
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
    •                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
    Discussions
    • TagsChevronRightIcon
    Cloud
    • Blog banner
      • News & UpdatesChevronRightIcon

      Choosing the Right Replication Strategy: Evaluating ADF + CDC vs. Snowflake Openflow

                                                       

      If you're delivering embedded analytics through Sisense, your dashboard is only as good as the data behind it. But how often do you think about what's happening upstream in the pipelines and ingestion architectures that determine whether that data is fresh, reliable, and cost-efficient before it ever reaches a visualization? QBeeQ is known in the Sisense ecosystem as a plugin and integration provider, but that's only part of what we do. This post is a window into the broader, strategic side of our work: architectural decision-making that happens well upstream of the BI layer but directly impacts the analytics experience your customers see. The client here uses Sisense to deliver embedded dashboards. We built their Snowflake-based data platform from the ground up:  integrations, ELT, data modeling, and governance with Sisense sitting at the top of the stack. The next question became: is our data replication approach from MS SQL Server into Snowflake the right one long-term, or should we move to Snowflake Openflow? A Platform Already in Motion Our relationship with our client didn't start with this POC. We previously helped them design and build a Snowflake-based data platform from the ground up, including data integrations, ELT processes, data models, and governance. That work gave them a solid, modern foundation for their analytics and reporting, including the embedded dashboards they deliver to their customers via Sisense. This POC was the next strategic step in that journey. With the platform stable and maturing, the question became: are we using the best possible approach for replicating data from their MS SQL Server into Snowflake? And more specifically, should we continue developing our custom ingestion approach, or move toward a more ready-to-go solution using Snowflake Openflow? Our client’s business depends on near-real-time data availability. Their operational data lives in MS SQL Server and feeds directly into Snowflake, where it powers analytics and reporting for their customers across retail, telecom, banking, and energy.  These aren't just technical concerns. They directly affect the quality and reliability of the analytics experience delivered to its end customers. The key business drivers behind this evaluation were: Faster availability of incremental data, especially for large transactional tables Lower operational risk and improved robustness Reduced maintenance effort over time Cost optimization at scale Putting Two Approaches to the Test Rather than making a decision based on vendor documentation or assumptions, we designed a structured POC to test both approaches in parallel, on the same three tables and similar data volumes, across four dimensions:  performance cost stability maintainability Option 1: Custom ADF + SQL CDC (Our Existing Solution) The key strength of this approach is control. We define the schema, manage data types, handle transformations during ingestion, and have full visibility into every step of the pipeline. This is the approach we built as part of the initial platform work:  CDC (Change Data Capture) - a native SQL Server feature that tracks only changed rows (inserts, updates, and deletes), eliminating the need to reload entire tables on every run Azure Data Factory (ADF) - Microsoft's cloud orchestration service, used here to move delta data from SQL Server to Azure Blob Storage Snowflake - which then loads and transforms the data using Snowpipe and scheduled tasks It's more engineering-intensive to set up, but the result is a robust, predictable, and highly tunable architecture. Option 2: Snowflake Openflow Openflow is Snowflake's newer, more plug-and-play approach to data ingestion. It uses Change Tracking (CT) on the SQL Server side, a lighter-weight mechanism than CDC,  and ingests data more directly into Snowflake with less custom orchestration required. On paper, it's appealing: faster to configure, fewer moving parts, and tighter integration within the Snowflake ecosystem. But as with any "managed" solution, there are trade-offs. And that's exactly what we needed to quantify. What We Found Performance Both approaches handled initial loads equally well. The gap appeared with delta loads — Openflow's Change Tracking completed incremental updates in 1–2 minutes versus 5–12 minutes for ADF + CDC. For near-real-time use cases, that's a genuine advantage worth noting. Cost This is where the picture shifts dramatically, and where decision makers should pay close attention: Openflow consumed approximately 12.5 Snowflake credits per day, translating to roughly $50/day or ~$1,500/month for this workload alone.  ADF + CDC came in at an estimated $8–15/month   That's not a marginal difference. That's a 100x cost gap on a three-table POC. Now consider what that looks like at scale. Most production environments don't replicate three tables; they replicate dozens, sometimes hundreds. If costs scale proportionally, an Openflow-based architecture could run into tens of thousands of dollars per month for a full production workload, compared to what remains a very modest cost with the custom ADF approach. For a data platform that's meant to be a long-term foundation, the compounding effect of that cost difference is enormous. Over a single year, the gap between these two approaches could easily reach $200,000 or more — money that could instead fund additional data products, analytics capabilities, or engineering capacity. For decision makers evaluating build vs. buy, or assessing the true TCO of a "managed" solution, this kind of analysis is exactly what's needed before committing to a direction. Stability & Maturity The Openflow SQL Server connector was still in preview status at the time of the POC. Runtime and canvas updates caused instability during our testing, and the solution requires ongoing infrastructure coordination. Azure Data Factory, by contrast, is a mature and battle-tested technology with a proven track record in production environments. Architecture & Maintainability Openflow introduced meaningful architectural complexity: requires Snowflake Business Critical edition (for PrivateLink connectivity) adds authentication and data sharing overhead offers limited control over target data types, and  handles soft deletes only, so hard deletes require additional handling Additional Snowflake-side transformations (PARSE_JSON, CLEAN_JSON_DUPLICATES) were also necessary. Our custom ADF solution, while more involved to build: gives full control over schema and transformations  handles deletes cleanly can be extended through a reusable automation procedure that simplifies onboarding new tables over time   Open Flow ADF + CDC Architecture Complexity ⚠️ Requires Business Critical + PrivateLink ✅ Simpler, fewer dependencies Stability  ⚠️ Preview — instability during POC ✅ Mature, production-proven Cost/month ⚠️ ~$1,500 ✅ ~$8–15 Initial load ✅ Comparable ✅ Comparable Delta load speed ✅ ~1–2 min ⚠️ ~5–12 min Onboarding new tables ✅ Fast and easy ⚠️ More setup, but automatable Schema & type control ⚠️ Limited ✅ Full control Delete Handling ⚠️ Soft deletes only ✅ Full delete support Our Recommendation The POC gave our client something genuinely valuable: a data-driven basis for a strategic architectural decision, rather than a choice made on assumption or vendor marketing. Our recommendation leaned toward continuing with the custom ADF + CDC approach as the long-term foundation. Not because Openflow lacks merit, but because the cost differential is substantial, the stability risks are real at this stage of the product's maturity, and the architectural overhead introduces complexity that isn't justified by the performance gain alone. That said, the delta load performance advantage of Openflow is meaningful. As the connector matures and if near-real-time requirements intensify, it remains a viable path to revisit. The POC ensures that if and when that moment comes, the decision will be informed, not reactive. What This Kind of Work Looks Like in Practice In the Sisense ecosystem, you may know us through our plugins and integrations. But this post reflects something equally important: our ability to act as a full-stack data platform partner. What your users see in Sisense is a function of decisions made far upstream. When those decisions lack rigor, the effects show up as latency, data gaps, and rising costs. Running a structured POC like this is often underestimated, but is one of the most valuable things we do for our clients. It's not just about finding the faster or cheaper option. It's about understanding the full picture: performance under realistic conditions, true cost at scale, architectural implications, and long-term maintainability. Every organization's situation is different. The right ingestion architecture depends on your data volumes, latency requirements, existing tooling, team capabilities, and cost constraints.  If you're thinking about your broader data strategy, not just what Sisense can do, but whether everything underneath it is built right, that's a conversation we're well-positioned to have. Thinking about your data platform strategy? Let's talk . QBeeQ is data strategy consulting firm made up of former Sisense employees and customers. We are a Sisense Gold Implementation Partner and Snowflake Select Partner

      Mia Isaacson
      Mia IsaacsonPosted 3 months ago
      0
               
      • Cloud Managed ServiceChevronRightIcon

      Creating and deleting EKS cluster in the existing VPC

                                               

      Creating and deleting EKS cluster in the existing VPC Introduction: This guide demonstrates how to create an Amazon EKS (Elastic Kubernetes Service) cluster within existing VPCs and subnets, and how to remove it using the same configuration file with a single command. It’s not a recommendation but just an example of the working solution and you have to adjust it according to your needs. Step-by-Step Guide: 1. Prerequisites If you haven’t connected to your AWS account yet, you need to configure it. You can either create a dedicated Linux bastion or use your local laptop. VPC Requirements : Ensure that there is a VPC with both public and private subnets in each of the three availability zones of your chosen region. Each node group must use only one availability zone. AWS CLI Installation : Depending on your operating system (bastion or laptop), install the appropriate version of the AWS CLI (Linux / MacOS / Windows). For installation instructions, visit: AWS CLI Installation . AWS Credentials Configuration : Configure your AWS credentials using one of the available methods. For guidance, refer to: AWS CLI Configuration . Install eksctl : Install the eksctl command-line tool. For installation instructions, visit: eksctl Installation . 2. Setting up cluster.yaml file The configuration below is valid and was tested with eksctl version 0.193.0. Replace the values in metadata.name, region, and the public and private subnet IDs with your own, and save it as cluster.yaml. As for the ‘version’ please refer to the Kubernetes Compatibility Matrix https://docs.sisense.com/main/SisenseLinux/linux-minimum-requirements.htm     apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: cluster-test region: us-east-2 version: "1.30" vpc: nat: gateway: Enable subnets: private: us-east-2a: id: subnet-022d3d9104ab651b4 us-east-2b: id: subnet-0b1c2ac0216e101c2 us-east-2c: id: subnet-09c84f9835a0ae13f public: us-east-2a: id: subnet-0fab7bc831ca7a25a us-east-2b: id: subnet-062966c1571fcef50 us-east-2c: id: subnet-08f3dbb5e5fae4b20 managedNodeGroups: - name: query-a labels: node-sisense-Application: "true" node-sisense-Query: "true" iam: withAddonPolicies: autoScaler: true awsLoadBalancerController: true certManager: true ebs: true efs: true fsx: true instanceType: m5a.2xlarge desiredCapacity: 1 minSize: 1 maxSize: 2 volumeSize: 300 availabilityZones: ["us-east-2a"] - name: query-b labels: node-sisense-Application: "true" node-sisense-Query: "true" iam: withAddonPolicies: autoScaler: true awsLoadBalancerController: true certManager: true ebs: true efs: true fsx: true instanceType: m5a.2xlarge desiredCapacity: 1 minSize: 1 maxSize: 2 volumeSize: 300 availabilityZones: ["us-east-2b"] - name: build labels: node-sisense-Build: "true" iam: withAddonPolicies: autoScaler: true awsLoadBalancerController: true certManager: true ebs: true efs: true fsx: true instanceType: m5a.2xlarge desiredCapacity: 1 minSize: 1 maxSize: 2 volumeSize: 300 availabilityZones: ["us-east-2c"]     Explanation of YAML Parameters apiVersion : Specifies the version of the eksctl API being used. This is important for compatibility with the features and configurations available in that version. kind : Defines the type of resource being created. In this case, it is a ClusterConfig , which indicates that the configuration is for an EKS cluster. metadata : Contains metadata about the cluster. name : The name of the EKS cluster. This should be unique within the region. region : The AWS region where the cluster will be created (e.g., us-east-2 ). version : The Kubernetes version to be used for the cluster (e.g., "1.30" ). vpc : Configuration related to the Virtual Private Cloud (VPC) where the EKS cluster will be deployed. gateway : Indicates whether to enable a NAT gateway for the cluster. Setting it to Enable allows private subnets to access the internet. private : Lists the private subnets by availability zone, each identified by its subnet ID. public : Lists the public subnets by availability zone, each identified by its subnet ID. nat : Configuration for Network Address Translation (NAT) gateways. subnets : Defines the subnets to be used for the cluster. managedNodeGroups : Configuration for the managed node groups that will run the workloads in the EKS cluster. Each node group can have its own settings. withAddonPolicies : Specifies which AWS services and features the node group should have permissions for, such as: autoScaler : Enables the Kubernetes Cluster Autoscaler. awsLoadBalancerController : Grants permissions for the AWS Load Balancer Controller. certManager : Grants permissions for managing SSL/TLS certificates. ebs : Grants permissions for Amazon Elastic Block Store. efs : Grants permissions for Amazon Elastic File System. fsx : Grants permissions for Amazon FSx. name : The name of the node group. labels : Key-value pairs used to organize and select the nodes in the group. iam : IAM role and policies associated with the node group. instanceType : The EC2 instance type to be used for the nodes (e.g., m5a.2xlarge ). desiredCapacity : The desired number of nodes in the node group. minSize : The minimum number of nodes in the node group. maxSize : The maximum number of nodes in the node group. volumeSize : The size of the EBS volume (in GiB) attached to each node. availabilityZones : Specifies the availability zones where the nodes in the group will be deployed. After setting up file you  can create a cluster with the  eksctl create cluster -f cluster.yaml command Obtain the kubernetes configuration by running the following command: aws eks update-kubeconfig --region us-east-2 --name cluster-test A shared storage (FSX) must be created manually     aws fsx create-file-system --file-system-type LUSTRE --storage-capacity 1200 --tags Key="Name",Value="cluster_test" --subnet-ids "subnet-0b1c2ac0216e101c2" --lustre-configuration "DeploymentType=PERSISTENT_1,PerUnitStorageThroughput=100"     --file-system-type LUSTRE  - only this type is supported by Sisense --storage-capacity 1200  -  the minimal 1200 GB storage for FSX Lustre --tags - update the name and other tags needed --subnet-ids "..." - one of the subnets of your VPC --lustre-configuration - according to the parameters supported https://docs.aws.amazon.com/fsx/latest/LustreGuide/using-fsx-lustre.html Conclusion: A summary of key takeaways or final points. The steps above should help you prepare an EKS cluster for the SIsense installation.   The cluster can be deleted with the single command: eksctl delete cluster -f cluster.yaml --disable-nodegroup-eviction References/Related Content: Links and resources for further reading. https://docs.sisense.com/main/SisenseLinux/linux-minimum-requirements.htm https://docs.sisense.com/main/SisenseLinux/autoscaling-and-linux.htm https://docs.sisense.com/main/SisenseLinux/deploying-sisense-on-amazon-eks.htm https://eksctl.io/usage/creating-and-managing-clusters/ https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html https://eksctl.io/installation/ https://docs.aws.amazon.com/fsx/latest/LustreGuide/using-fsx-lustre.html

      Oleg Valynkin
      Oleg ValynkinPosted 1 year ago
      0
               
      • TroubleshootingChevronRightIcon

      How to Troubleshoot UI Issues Using DevTools (HAR File & Console Logs)

                                                                                               

      How to Troubleshoot UI Issues Using DevTools (HAR File & Console Logs) Step 1: Open Developer Tools (DevTools)  Open Google Chrome, Microsoft Edge, or Mozilla Firefox.  Press F12 or Ctrl + Shift + I (Cmd + Option + I on Mac) to open DevTools. 3. A panel will appear on the side or bottom of your browser.  Step 2: Check Network Requests  The Network tab shows all requests your browser makes when loading a page. If a request fails, the webpage may not display correctly. How to check failed requests?  Click the Network tab.  Reload the page (F5 or Ctrl + R).  Look for requests marked red – these are failed requests.  [ ALT text: A computer screen displaying a dashboard with a message indicating an error or failed request. On the left side, there is a section labeled "Dashboard" with various options, while the right side shows a network activity log with a list of requests, highlighting a failed request in red. Below the image, there are instructions to click on a failed request for more details.] 4. Click on a failed request to see more details.  What to look for?   - Red requests – These are errors that may cause the page to break. - Slow requests – If a request takes too long, it could slow down the page. - Blocked requests – Some files may be blocked due to browser settings, firewalls, or extensions.  Step 3: Check Details in Preview and Response Tabs  If a request has failed, click on it and check:  - Preview Tab – Shows what the request should have loaded. If it’s empty or has an error message, there may be a problem with the server. [ ALT text: "Screenshot of a web browser displaying a 'Sample Not Found' error message within a dashboard context. The left panel shows the message along with a graphic of a computer with a sad face, while the right panel displays developer tools including a network tab, with details of an API request highlighted."]    - Response Tab – Shows the actual response from the server. If you see an error like 403 (Forbidden) or 500 (Internal Server Error), this might indicate a server-side issue.   [ ALT Text: A computer screen displaying an error message that says "Could not load data!" on the left, next to a web browser's developer tools showing a network request with an error highlighted in red on the right.]   Step 4: Check the Console Tab for Other Errors  The Console tab shows extra error messages that might explain why something isn’t working.  How to check for errors? - Click the Console tab.  - Look for messages in red – these are errors.  - If you see an error, take a screenshot or copy the message.   [ ALT text: A screenshot of a web development environment showing a "Sample" document with a "Could not load" error message. The interface displays various errors in a red-highlighted section of the console, indicating multiple problems related to content loading and resource access. The left side features a visual element of a computer graphic with a face, and the bottom includes a message stating "Could not load".] Common Console Errors:  - 404 Not Found – The file or resource is missing.  - 403 Forbidden – You might not have permission to access something. - 500 Internal Server Error – A problem on the server side.  Step 5: Save a HAR File to Share with Support  If you need help, save a HAR file with all network details:  Click the Network tab.  Click the Record button if it is not already active.  Reload the page (F5 or Ctrl + R).  Click the Download (Export) button or right-click inside the Network panel and select Save as HAR with content. Save the file and attach it when contacting support. [ ALT Text: Screenshot of a browser's developer tools, specifically the Network tab. Two buttons labeled "Record" and "Experiment" are highlighted in red. Below, a table includes various columns for details such as "Time," "Initiator," "Type," and "Size," with different entries listed for each column. The interface displays data related to web requests.]  Step 6: What to Send to Support?  If you need help, send the following details:  - A short description of the issue.  - Screenshots of errors from the Console tab.  - The HAR file (from the Network tab).  - The exact time and date when the issue happened.  5. Conclusion: A summary of key takeaways or final points.  By using DevTools, you can quickly find and report UI issues, helping the support team fix them faster. If you have any questions, feel free to contact support with your findings.  Need more guidance? Let us know! We’re happy to assist. References/Related Content: Links and resources for further reading. https://community.sisense.com/t5/knowledge-base/generating-a-har-file-for-trou bleshooting-sisense/ta-p/9523   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.

      Alina Malynovska
      Alina MalynovskaPosted 1 year ago
      0
               
      • APIsChevronRightIcon

      Reverting the proxy URL (base URL) setting in Sisense Linux L2021.1.0+

                                       

      Reverting the proxy URL (base URL) setting in Sisense Linux L2021.1.0+ Introduction Sisense allows configuring the application to be accessed behind a reverse proxy. There are two main steps to do so: Create and configure a reverse proxy server (e.g. Nginx or Apache) to proxy traffic from the desired URL to the Sisense server. Update the Proxy (Base) URL in the Sisense settings. In cases when the first step was not finished or was misconfigured, proceeding with the second step may lock you out of the application, preventing you from reverting the Proxy URL changes in Sisense. This guide explains how to revert the changes via REST API and Sisense admin credentials. For more details about the proxy configurations please refer to https://community.sisense.com/t5/knowledge-base/reverse-proxy-with-nginx-ssl-configuration/ta-p/5358   Step-by-Step Guide Option 1 - API request Generating a Bearer token via REST API Send the POST /api/v1/authentication/login request: Body (Using x-www-form-urlencoded ) Property Value username The username you log in to Sisense with password The password you log in to Sisense with The resulting HTTP request should look like: POST /api/v1/authentication/login HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Example of the content: username=user%40example.com&password=12345678 The response body will contain a JSON with the “access_token” entry, for example: {   "success" : true,   "message" : "" ,   "access_token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiNjcyZTEzZjk4YzI0NmEwMDFkNTQ0ZjRjIiwiYXBpU2VjcmV0IjoiZmVkM2EyYzctMjdkYS1kNGNjLWFjNTktYmRlNTVkZWI3NmJlIiwiYWxsb3dlZFRlbmFudHMiOlsiNjcyZTEzZjk4YzI0NmEwMDFkNTQ0ZjU5Il0sInRlbmFudElkIjoiNjcyZTEzZjk4YzI0NmEwMDFkNTQ0ZjU5IiwiZXhwIjoxNzMxNjgwMzk0LCJpYXQiOjE3MzEwNzU1OTR9.UPEtpUkThvG8nWoGqNNDozZZyS-BjeTjjCyZodof8qg" ,   "profile" : {},   "tenantId" : "672e13f98c246a001d544f59" ,   "roleName" : "super" ,   "userId" : "672e13f98c246a001d544f4c" } Sending a POST request to update Sisense settings Send the POST /app/configuration/configurations/system/list request: Headers : Authorization: “Bearer eyJhbGciO… ” * Replace the token with a token generated in the previous step. Body (raw, JSON) : { "base" :{ "webServer.proxyurl" :null}} Wait 3-5 minutes until Sisense applies the changes and restarts the relevant services. Log into Sisense using a direct non-proxied address.   Option 2 - Server Access (for On-Prem installations) Connect to a server with configured kubectl: In case of a single node - the Sisense server In case of a Sisense-installed Kubernetes - the first node of the cluster In case of Cloud Kubernetes - the bastion machine Run the following commands: 1. kubectl exec -it -n sisense $(kubectl get po -n sisense -l app=configuration -o name | tail -n 1) -- bash * Replace the “sisense” namespace if you use a non-default namespace 2. node node_modules/@sisense/sisense-configuration/bin/sisense-conf setbase webServer.proxyurl null -p -c ${ZOOKEEPER_CONN_STRING} 3. Wait 3-5 minutes until Sisense applies the changes and restarts the relevant services. 4. Log into Sisense using a direct non-proxied address. Conclusion It is important to deploy and configure a reverse proxy server before introducing the configuration changes to the Sisense application. Failing to do so may lock you out of Sisense UI and you will have to use one of the above programmatic approaches to revert the configuration changes. Relevant Content: Docs: https://docs.sisense.com/main/SisenseLinux/configuration-manager-sisense-documentation.htm Dev Docs:  https://sisense.dev/guides/restApi/v1/?platform=linux&spec=L2023.11#/authentication

      Andrii Lohvin
      Andrii LohvinPosted 1 year ago
      0
               
      • TroubleshootingChevronRightIcon

      Sisense application logs

                                       

      Sisense application logs The Sisense Support team typically uses the application log data  to investigate outages, troubleshoot bugs, or analyze reported issues . Analyzing application logs can help the Support team determine the root cause of incidents.  The location of log directories on a single node:   /var/log/sisense/namespace/   /var/log/sisense/sisense/query.log /var/log/sisense/sisense/combined.log -- logs of all services If your environment does not have this setup, here is how you can gather the appropriate logs to share For Example, if interested to Access galaxy logs:   kubectl -n sisense logs $(kubectl -n sisense get pods -l app=" galaxy "   -o custom-columns=":.metadata.name"   ) Tail the log and print the last 100 lines: kubectl -n sisense -f --tail=100   logs $(kubectl -n sisense get pods -l app=" galaxy "   -o custom-columns=":.metadata.name"   ) Get logs from specific pod:   sisense@node1: kubectl logs $(PODNAME) -n $(NAMESPACE)   Helpful Tips: In all Sisense installs, it would be very helpful to generate the Support File in the Admin tab under 'System Management'.  When the issue occurs, you can download the file; this  application log is a  file that contains information about events that have occurred within a software application. This   file contains logs of all services.     Additional Resources: Guideline for submitting a Support inquiry   Overview to Interpreting Sisense 7.2+ Logs

      Vicki786
      Vicki786Posted 1 year ago
      0
               
    • Blog banner
      • News & UpdatesChevronRightIcon

      Implementing Self-Service BI with Sisense: Key Steps and Insights

                                                               

      Our Story: How We Implemented Self-Serve BI Using Sisense In a team set-up with only a few tech-savvy members but numerous data-hungry stakeholders, building and delivering a dashboard used to take weeks, if not months. The backlog of requests was ever-growing. To address this, we decided to roll out a self-serve BI platform using Sisense. Starting Point: Gathering Requirements The first step was engaging with the different stakeholders to gather their requirements. We then prioritized these requirements based on their impact and identified overlapping requests to avoid duplication of resources and efforts. Each requirement was broken down into specific metrics, and we documented the sources for each metric. Leveraging our existing BI platform, Sisense, we began setting up the self-serve solution. Building the Foundation: Elasticubes and Live Models One thing worth mentioning is that we translated the requirements into dbt models and made it a best practice to create and maintain most of the metrics in dbt. These models are the sources for our Sisense models. This approach ensures that we maintain a single source of truth, which is essential for self-serve analytics. By leveraging dbt, we can standardize the metrics across the organization, reduce discrepancies, and facilitate better decision-making Based on our requirement analysis, the team built Sisense data models for each category or department. For instance, the Sales model included information on complaints received. A separate model was dedicated to complaints and refunds linked with customer care data. These smaller models help stakeholders navigate easily and find what they need, rather than getting lost in a massive, complex model. We preferred Live Models over Elasticubes because they provide the most recent data from the lake without the need for frequent scheduling. This approach also saves a lot of memory. Creating Template Dashboards The next step was to create template dashboards with basic metrics from each model. These templates included simple to complex widgets showcasing metrics based on stakeholder requirements. The purpose of these templates was to give stakeholders a starting point and a reference. Training and User Adoption We conducted several workshops to ensure that all teams could effectively utilize the new BI tool. These sessions were designed not just as instructional meetings but as interactive workshops where stakeholders actively engaged with the tool and provided real-time feedback. Sisense’s intuitive UI and easy-to-navigate menu significantly contributed to the ease of use, enabling our non-technical counterparts to quickly get up to speed. Throughout the training, we fostered a collaborative environment where stakeholders were encouraged to explore the tool and share their experiences. This two-way engagement ensured that the BI team could address any concerns and adapt the training content to meet the users’ needs better.  We’ve also implemented usage analytics and data governance dashboards to track how effectively teams use the self-serve BI platform. This dashboard allows us to monitor adoption and identify areas where additional support is needed. This proactive approach has been key to optimizing the platform’s impact across the organization. The dedication and enthusiasm of our stakeholders were instrumental in the success of this rollout. By working closely with the BI team, they not only learned to navigate the tool but also contributed to refining its use within the organization. This collaborative approach ensured that the deployment of the BI platform was smooth and well-received across all departments. Handling Feature Requests As we rolled out self-serve, some feature requests were not native to Sisense. For example, stakeholders wanted to perform 'What If' analyses, a feature available in some other BI tools. Another request was the ability to pick widgets from various dashboards to create a custom personal version. Thanks to Sisense's versatility and customizability, we achieved this by installing third-party add-ons. Ensuring Data Security Ensuring robust data security is paramount in rolling out a self-serve BI platform. We have implemented stringent measures to safeguard our data and prevent unauthorized access. One key aspect of our approach is the use of row-level security, which allows us to control data visibility at a very granular level. Additionally, the ability to create and manage user groups in Sisense provides us with the flexibility to assign appropriate access levels to different users, ensuring that each user has access only to the data they need. This comprehensive approach to data security helps us maintain a secure and reliable BI environment. By sharing our experience, we hope to inspire others to leverage Sisense to implement self-serve BI solutions efficiently and effectively. Testimonials: ‘We had a training today and I’m feeling super excited about it - it’s going to take a bit of upfront investment from my team to familiarise ourselves with how to use it but I think after that it will save us SO much time (and so much frustration - I was battling with pivot tables in excel for hours this week!).’ -Head of Food Development & Trading ‘When I first started using Sisense, I was a complete newbie, but I was surprised by how intuitive the tool actually is ! Self-serving in Sisense allowed me to explore different data visualizations and patterns and understand more about our data structures as well. I strongly recommend that people use it (not just for dashboards but) if they are interested in a quick data download or for quick visualizations to check a hypothesis ! And the data platform team is great in helping out and giving advice when needed!’   -Senior Analyst   About the author:  I am a Senior BI Developer at Gousto with nearly 14 years of industry experience. I am passionate about data and a strong advocate of Ronald H. Coase’s quote: “If you torture the data long enough, it will confess to anything.” In my three years with Gousto, I have played a key role in shaping the company’s BI platform, driving innovation and data-driven decision-making. About the Company: We are a data company that loves food. We combine our passion for culinary delights with cutting-edge data solutions to deliver an exceptional experience to our customers. At Gousto, we harness the power of data to innovate and improve every aspect of our recipe box service.  

      Priscillareagan
      PriscillareaganPosted 1 year ago • Last reply 1 year ago
      3
               
      • TroubleshootingChevronRightIcon

      Resolving Installation Failures with "Error occurred during validate_ssl_certs section"

                                       

      Resolving Installation Failures with "Error occurred during validate_ssl_certs section" Issue: During the installation process on a Linux system, you may encounter the error message: "Error occurred during validate_ssl_certs section." This error typically occurs when there is an issue with the SSL certificate being used. Solution: To resolve this issue, you need to validate the SSL certificate and ensure it matches the corresponding private key. This can be done using the openssl command-line tool, which is widely used for managing and validating SSL certificates. NOTE: You can use this guide as a general reference for validating SSL certificates in various contexts, whether during software installations, server setups, or routine security checks. Steps to Validate the SSL Certificate: Check if the Certificate and Key Files Exist: First, ensure that both the certificate and key files are present in the specified locations. <span>CERT_PATH="/path/to/your/certificate.crt"</span><br/><br/><span>KEY_PATH="/path/to/your/private.key"</span> <span>if [[ -f "$CERT_PATH" && -f "$KEY_PATH" ]]; then</span><br/><br/><span>  echo "Certificate and key files exist."</span><br/><br/><span>else</span><br/><br/><span>  echo "Certificate or key file does not exist."</span><br/><br/><span>  exit 1</span><br/><br/><span>fi</span> Validate the SSL Certificate: Use the following command to display the details of the certificate. This helps in verifying whether the certificate is properly formatted and valid. <span>openssl x509 -in "$CERT_PATH" -text -noout</span> <span>if [[ $? -eq 0 ]]; then</span><br/><br/><span>  echo "Certificate is valid."</span><br/><br/><span>else</span><br/><br/><span>  echo "Certificate is invalid."</span><br/><br/><span>  exit 1</span><br/><br/><span>fi</span> Check if the Certificate and Key Match: It's crucial that the SSL certificate matches the private key. The following commands compare the modulus of the certificate and key to ensure they match. <span>CERT_MODULUS=$(openssl x509 -noout -modulus -in "$CERT_PATH" | openssl md5)</span><br/><br/><span>KEY_MODULUS=$(openssl rsa -noout -modulus -in "$KEY_PATH" | openssl md5)</span> <span>if [[ "$CERT_MODULUS" == "$KEY_MODULUS" ]]; then</span><br/><br/><span>  echo "Certificate and key match."</span><br/><br/><span>else</span><br/><br/><span>  echo "Certificate and key do not match."</span><br/><br/><span>  exit 1</span><br/><br/><span>fi</span> Conclusion: If the certificate and key files exist, the certificate is valid, and the certificate matches the key, then the SSL setup is likely correct. If any of these checks fail, you may need to reissue or replace the certificate and key files. This should resolve the "Error occurred during validate_ssl_certs section" error and allow your installation process to proceed. Always ensure you use valid and correctly matched SSL certificates and keys to avoid such issues.   Check out this related content: Academy Course   Sisense Documentation 

      Vlad Solodkyi
      Vlad SolodkyiPosted 1 year ago
      0
               
    • Blog banner
      • Embedding AnalyticsChevronRightIcon

      Demonstrating ComposeSDK Styling Of Sisense Dashboard Widgets

                                                                                               

      Demonstrating ComposeSDK Styling Of Existing Sisense Dashboard Widgets When developing   ComposeSDK   embedded applications, there are three principal techniques for embedding or converting an existing Sisense widget. Discussing each method, and some of the benefits associated with them: Direct Rendering existing Sisense Dashboard Widgets with the   DashboardWidget   Function: The expedited approach involves rendering an existing Sisense widget directly using the   DashboardWidget   function. While this method ensures swift integration, it does not allow all data options of the widget to be edited within ComposeSDK or defined as variables, one of the features of native ComposeSDK widgets. Nevertheless, customization of other   parameters, including styling , remains feasible based on the props used. Mandatory parameters include the dashboard and widget ID, which allow the rendering of an existing Sisense widget. Widget Recreation using ComposeSDK to Create Native ComposeSDK widgets An alternative method,   detailed in this article , entails recreating the widget as a native ComposeSDK widget by employing an existing Sisense widget as a template for a new not directly linked ComposeSDK widget. Though potentially more time-intensive, this approach yields a fully customizable native ComposeSDK widget. It stands independent of any specific widget or dashboard on the Sisense server, enabling complete independence to changes made to the original dashboard or widget, or complete deletion of the widget used as the model. Loading Widget Metadata with the useGetWidgetModel function Leveraging the  useGetWidgetModel  ComposeSDK function provides a middle option, detailed in this article . It allows automating the return of widget metadata from an existing Sisense widget, facilitating dynamic modifications within ComposeSDK. This method balances somewhat the autonomy of entirely recreating a widget as a native ComposeSDK widget and rendering a widget as a Dashboard Widget. In this article, we will demonstrate and discuss the DashboardWidget rendering feature, a powerful capability within ComposeSDK that allows the embedding and rendering of existing widgets. The focus will be on exploring the large number of styling options provided by this feature. Among the properties of a DashboardWidget component, the styleOptions parameter determines the styling. This parameter accepts a DashboardWidgetStyleOptions object , which includes a large number of parameters documented in detail below and in this documentation page . To demonstrate a practical implementation of using these styling options, the following code example showcases a Compose DashboardWidget utilizing all documented parameters within the DashboardWidgetStyleOptions object.     import { DashboardWidget } from "@sisense/sdk-ui"; export function ComposeSDKChart(props) { let styleOptions = { "backgroundColor": "lightblue", "border": true, "borderColor": "green", "cornerRadius": "Large", "shadow": "Dark", "spaceAround": "Large", "header": { "hidden": false, "titleAlignment": "Center", "backgroundColor": "lightblue", "titleTextColor": "blue" }, "height": 200, "width": 200 }; return (<DashboardWidget widgetOid={'65ab8958857ff900335db870'} dashboardOid={'65ab8948857ff900335db86e'} styleOptions={styleOptions} title={"My Chart"} />) }        The final result in this example is the widget below, showing the effect of this styling in this specific case:   Discussing each style option individually, including the type of parameter accepted by each style setting. backgroundColor: Type: string - Specifically a string containing an  HTML color Description: This option sets the background color of the widget. In the example, the background color is set to "lightblue," a preset standard HTML color code that is equal to #ADD8E6 as a hex color code. border: Type: boolean  Description:  This option determines whether the widget container has a border or not. In the example, the border is enabled with the value set to true , adding a defined boundary to the widget that can be styled. borderColor: Type: string - Specifically a string containing an  HTML color , Description: Specifies the color of the widget container's border.  cornerRadius: Type: "Large" | "Medium" | "Small" - Three specific options set as specific strings Description: Defines the corner radius of the widget container, similar to the CSS property of the same name, allowing for customization of the widget container's shape. header: Type: object- Contains various parameters that control the styling of the header and title. Description: A style object to customize the widget header. It includes options like background color, divider line toggle, divider line color, header visibility toggle, title alignment, and title text color. header.backgroundColor: Type: string - Specifically a string containing an HTML color Description: Sets the background color of the widget header. header.dividerLine: Type: boolean Description: Controls the visibility of the divider line between the widget header and the chart. header.dividerLineColor Type: string - Specifically a string containing an HTML color Description: Specifies the color of the divider line, if visible. header.hidden Type: boolean Description:   Toggles the visibility of the header and title. header.titleAlignment Type: "Left" | "Center" - Two specific options set as specific strings Description: Alignment of the title within the header. The example centers the title using the value "Center. header.titleTextColor Type: string- Specifically a string containing an HTML color Description: Specifies the text color of the header title. height: Type: number - Number in pixels Description: Sets the total height of the widget in pixels. If not explicitly set will use the height of the container. width: Type: number - Number in pixels Description: Sets the total width of the widget in pixels. If not explicitly set will use the width of the container. shadow: Type: "Medium" | "Light" | "Dark" - Three specific options set as specific strings Description: Defines the shadow level of the widget container, similar to the CSS style of the same name.  Effects styling only when spaceAround is defined. spaceAround: Type: "Large" | "Medium" | "Small"  - Three specific options set as specific strings Description: Specifies the space between the widget container edge and the chart.   With these styling options, one can modify the visual styling of a ComposeSDK DashboardWidget, enabling a large amount of style customization for an otherwise unchanged existing dashboard widget selected from an existing dashboard on the Sisense server. While ComposeSDK DashboardWidgets may not offer the extensive modification capabilities available to native ComposeSDK widgets, such as the ability to completely modify all of widget data options, they still provide a large degree of extensive visual customization through the use of styling options. Share your experience in the comments!   

      Jeremy Friedel
      Jeremy FriedelPosted 2 years ago • Last reply 2 years ago
      1
               
    • Blog banner
      • News & UpdatesChevronRightIcon

      How Sisense helped Mytonomy leverage its viewership data

                                                                                               

      As a software company focused on video-based patient education and engagement, Mytonomy is always looking for ways to improve our product in the competitive healthcare market. Our wholly-owned content studio produces videos and written assets for our robust library of content, and our software platform ensures that patients are presented with the most relevant educational material available. For both these areas, we continuously collect large amounts of data on patient education assignments, viewership patterns, and more. However, restricted by limited resources and needing to focus on new features for our platform product, our engineering team was unable to focus on the analytics and data visualization needs of our customers.  This is where Sisense came into the picture. Sisense was selected by Mytonomy as a data visualization product that could be embedded into our existing platform, providing a seamless experience to our customers. Given that Mytonomy works in the healthcare industry, it was also necessary to use a HIPAA-compliant product like Sisense to maintain security for our health system customers. We began our implementation by creating Elasticubes from our existing data warehouse and building dashboards for an internal audience first. After some fine-tuning, we set out to replace our internally built widgets with Sisense’s embedded dashboard functionality. We were impressed by the versatility and features that Sisense offered with their Web Access Token (WAT) framework and chose WAT as the best way to embed dashboards into our platform. WAT helps us publish common dashboards to all customers while also enforcing data security and authorizing requirements. Since this was a novel implementation for us, we ran into several questions during development that required additional assistance, and had no trouble finding the help we needed. Often, the solution to an issue could be found in the growing and informative Sisense Community forum. Additionally, the Sisense official support team was accommodating and helpful, usually responding within a few hours with a deep knowledge of the product and providing actionable solutions. Since going live with Sisense’s embedded dashboards, the client reception has been exceptional. Along with the standard embedded dashboards for all customers, we have easily created custom dashboards and widgets to suit each client’s more specific needs. Sisense has helped Mytonomy and our customers understand usage patterns and fine-tune our patient engagement algorithms. More recently, Mytonomy has begun utilizing several other Sisense features to enhance our product, like enabling Pulse alerts to keep us aware of possible issues and automatically emailing dashboards to stakeholders on a set schedule. We have used it to conduct various root cause analyses, help customers find their ROI and justify their investment in Mytonomy, and identify trends – both positive and negative – so that appropriate action can be taken. Overall, Sisense has greatly enhanced Mytonomy’s product while providing clients with data insights that would not otherwise be available.  About the Author: Zach Williams is the Senior Software Engineer for Integrations at Mytonomy. He has worked with Sisense since his start at Mytonomy and is the go-to resource for Sisense at Mytonomy.

      Zach Williams
      Zach WilliamsPosted 2 years ago
      0
               
      • Embedding AnalyticsChevronRightIcon

      Using "useGetWidgetModel" to Embed an Existing widget in ComposeSDK

                                                                                               

      Using "useGetWidgetModel" to Embed an Existing Widget in ComposeSDK When developing ComposeSDK embedded applications, there are three principal techniques for embedding or converting an existing Sisense widget. Discussing each method, and some of the benefits associated with them: Direct Rendering existing Sisense Dashboard Widgets with the DashboardWidget Function: The expedited approach involves rendering an existing Sisense widget directly using the DashboardWidget function. While this method ensures swift integration, it does not allow all data options of the widget to be edited within ComposeSDK or defined as variables, one of the features of native ComposeSDK widgets. Nevertheless, customization of other parameters, including styling , remains feasible based on the props used. Mandatory parameters include the dashboard and widget ID, which allow the rendering of an existing Sisense widget. Widget Recreation using ComposeSDK to Create Native ComposeSDK widgets An alternative method, detailed in this linked article , entails recreating the widget as a native ComposeSDK widget by employing an existing Sisense widget as a template for a new not directly linked ComposeSDK widget. Though potentially more time-intensive, this approach yields a fully customizable native ComposeSDK widget. It stands independent of any specific widget or dashboard on the Sisense server, enabling complete independence to changes made to the original dashboard or widget, or complete deletion of the widget used as the model. Loading Widget Metadata with the useGetWidgetModel function Leveraging the useGetWidgetModel ComposeSDK function provides a middle ground. It allows automating the return of widget metadata from an existing Sisense widget, facilitating dynamic modifications within ComposeSDK. This method balances somewhat the autonomy of entirely recreating a widget as a native ComposeSDK widget and rendering a widget as a Dashboard Widget. Using the format below, the entire ComposeSDK metadata equivalent of an existing Sisense widget can be imported and be used directly to render a direct ComposeSDK equivalent:   import { Chart, useGetWidgetModel } from "@sisense/sdk-ui"; /** * Retrieves and renders a ComposeSDK equivalent of an existing Sisense widget using one of three methods. * Method 1: Rendering an existing Sisense widget directly as a ComposeSDK DashboardWidget. * Method 2: Recreating the widget independently as a native ComposeSDK widget using a Sisense widget template. * Method 3: Programmatically loading ComposeSDK metadata using the useGetWidgetModel function. * * @param {string} dashboardOid - The ID of the Sisense dashboard containing the widget. * @param {string} widgetOid - The OID of the Sisense widget to be converted. * @returns {JSX.Element} - The ComposeSDK Chart component rendering the converted widget. */ const convertSisenseWidgetToComposeSDK = ({ dashboardOid, widgetOid }) => { const { widget, isLoading, isError } = useGetWidgetModel({ dashboardOid, widgetOid, }); if (isLoading) { return <div>Loading...</div>; } if (isError) { return <div>Error</div>; } if (widget) { // Extract ComposeSDK metadata equivalent of the Sisense widget const widgetProps = widget.getChartProps(); // Render the ComposeSDK Chart component with the converted widget metadata return <Chart {...widgetProps} />; } return null; }; // Example usage: const sisenseToComposeSDKWidget = convertSisenseWidgetToComposeSDK({ dashboardOid: 'yourDashboardID', widgetOid: 'yourWidgetOID', });   The variable widgetProps contains the entire widget metadata equivalent of the Sisense widget. This is a standard Javascript object that contains all of the Sisense metadata in the format ComposeSDK expects. These parameters can be changed in the object similar to any other Javascript object. The useGetWidgetModel function, introduced in the latest ComposeSDK version as of January 2024, fetches the entire ComposeSDK metadata equivalent of a Sisense widget. However, certain errors may arise when the metadata returned is used to render a widget, necessitating minor adjustments to the props returned. For instance, the widget dataSource parameter can includes the server name, which is often "localhost," triggering an "ElastiCube not found" error in ComposeSDK. Mitigate this is possible by eliminating "localhost/" from the returned prop object:   widgetProps.dataSet = widgetProps.dataSet.replace("localhost/" , "")    Similar changes can be made to any other parameters where issues may occur. It is important to note that widgets rendered using useGetWidgetModel retain all limitations and variations of ComposeSDK, and unsupported widget types in ComposeSDK are still not renderable. As an example, ComposeSDK widgets require a Value metadata item, while native Sisense widgets can render with only a category panel item. Additionally, if left permanently in the code, the Sisense widget and its corresponding dashboard must persist, as useGetWidgetModel fetches the widget metadata on each call. As a result, any changes made to the widget in native Sisense will be reflected, which can be useful. Similar to the method discussed here , useGetWidgetModel  can facilitate the conversion of a widget into a fully native ComposeSDK model instead of using the web console of native Sisense, the returned props from "useGetWidgetModel" can be console logged and copied directly. Once the necessary metadata is copied, the function can be "useGetWidgetModel", and the widget will be a fully native ComposeSDK widget. A native Sisense widget: The widget is rendered using ComposeSDK and useGetWidgetModel: The widget metadata returned console logged. These can be copied directly from the console, avoiding potentially the continual use of useGetWidgetModel. Share your experience in the comments!   

      Jeremy Friedel
      Jeremy FriedelPosted 2 years ago
      0