Search

Clear filter
Announcement
Anastasia Dyubaylo · May 29, 2022

[Video] Running InterSystems IRIS Workloads in the Cloud: Lessons Learned

Hey Developers, Join us as we share lessons learned from standing up the initial InterSystems cloud offerings. We'll cover the challenges of standing up a SaaS and how to meet them: ⏯ Running InterSystems IRIS Workloads in the Cloud: Lessons Learned 🗣 Presenter: @Eduard.Lebedyuk, Sales Engineer, InterSystems Stay tuned for the latest videos on InterSystems Developer YouTube!
Article
Deirdre Viau · Apr 1, 2022

InterSystems Reports: How to store Server system databases in IRIS

InterSystems Reports Server stores system tables in an IRIS instance of your choice. How is this configured? Read this article if: You installed Logi Server directly using the Logi installer, not the InterSystems install script, OR You want to change the system database configuration Background The system databases are initially configured upon install. The InterSystems install script asks you for a superserver port, namespace, and user. It creates the namespace and does the Logi setup for you. If you run the Logi installer directly, it puts the system databases in a local Derby database by default. InterSystems Reports Server queries the system databases upon startup. If startup fails with the message "An error occurs when connecting to the database", it may be related to this setup. Clarification InterSystems Reports has two types of database connections. These databases are completely unrelated. They can be on the same IRIS instance, but they don't have to be. Database What it stores Where connection is configured Server system database Logi Server configuration and states. Example: Logi user table dbconfig.xml in InterSystems Reports Server file structure, or Server UI Report data source The data that is displayed on reports. Example: Patient diagnoses Designer Catalog Manager How to configure system databases post-install 1) If InterSystems Reports Server is running, shut it down cleanly. 2) Put a copy of the IRIS JDBC driver somewhere on the machine. Make note of the path. Example: C:\MDV\intersystems-jdbc-3.1.0.jar 3) In setenv.bat (Windows) or setenv.sh (Linux), in the installation's bin folder, add the JDBC driver path to the ADDCLASSPATH string. For Windows, use a semicolon (;) as a delimiter. For Linux, use colon (:). Example (Windows): set ADDCLASSPATH=%REPORTHOME%\lib;%JAVAHOME%\lib\tools.jar;C:\MDV\intersystems-jdbc-3.1.0.jar 4) Create a database and namespace in your IRIS instance. To avoid conflicts, only use these for InterSystems Reports; do not share with another application. No special mappings are required. 5) Create a user with access to your database. This is used to retrieve data via JDBC query. 6) Update the connection info in dbconfig.xml, in the installation's bin folder. Refer to this documentation. The url has the format: jdbc:IRIS://<server name>:<superserver port>/<namespace> 7) Start InterSystems Reports Server. Frequently Asked Questions Q. How can I tell if this worked? A. Start InterSystems Reports Server, and make sure it starts succesfully. Then, see if any Logi tables were created in your IRIS namespace. You can use SQL Explorer and check the SQL.User schema. Q. Do these steps copy the content of the system tables to the new database? A. No. This creates fresh tables, like a new install. This may be fine right after install, or in a test system. If you need to preserve the content of the tables, use the DBMaintain tool to backup and restore: Backing up and Restoring Server Data (v18) Q. InterSystems Reports Server won't start. There are errors in the log like: [SQLCODE: <-201>:<Table or view name not unique>] [%msg: <Table 'SQLUser.UPDATEDETAILS_1' already exists>] A. This can happen when you change the system username after the system databases have been set up in IRIS. The Logi tables already exist in IRIS, with the old user as owner. The new user does not have access. To fix this, give the new user full privileges on all SQLUser tables in the namespace. Additional Documentation Configuring the Server Database (v18) InterSystems Reports Server Installation
Announcement
Evgeny Shvarov · Mar 21, 2022

Technical Bonuses for InterSystems IRIS Globals Programming Contest 2022

Hi Developers! Here're the technology bonuses for the InterSystems IRIS Globals Contest 2022 that will give you extra points in the voting: Data-model implementation - 5 Functional index implementation - 5 Data Move usage - 3 Embedded Python - 4 Docker container usage - 2 ZPM Package deployment - 2 Online Demo - 2 First Article on Developer Community - 2 Second Article On DC - 1 Code Quality pass - 1 Video on YouTube - 3 See the details below. Data-model implementation - 5 pointsIntroduce an application that provides an API to implement any new to InterSystems IRIS data model. E.g. columnar data store, time-series database, graph datastore, document store, key-value database. An API should contain at least the options to create/alter entities metadata, insert/update/delete data, query data, index data. E.g. here is an example of iris-graph implementation (not finished and abandoned project). You are also welcome to fork it and finish the implementation for the contest. The implementation can also mimic any other database engine of such in IRIS, e.g. mimic MongoDB or Redis in IRIS. Examples: InterSystems IRIS as MongoDB InterSystems IRIS as Redis (Implementation 1, Implementation 2) The implementation should be "non-trivial" - e.g. CRUD API for key-value to globals will not be enough, but the implementation with the support of metadata management, indexing, and search/query will work. Functional Index Implementation - 5 points Introduce an implementation of Functional Index with globals and collect 5 extra points. Documenation. Example. Data Move usage -3 points DataMove is a powerful feature for moving data from one database to another in a live environment, but it operates at a fairly low level. Adding a layer around it for easy archiving of table data, an interface to keep track of (potentially large numbers of) subscript-level mappings, etc.. would be examples of helpful utilities in the big global space. Embedded Python - 4 points Use Embedded Python in your application and collect 4 extra points. You'll need at least InterSystems IRIS 2021.2 for it. Docker container usage - 2 points The application gets a 'Docker container' bonus if it uses InterSystems IRIS running in a docker container. Here is the simplest template to start from. ZPM Package deployment - 2 points You can collect the bonus if you build and publish the ZPM(InterSystems Package Manager) package for your Full-Stack application so it could be deployed with: zpm "install your-multi-model-solution" command on IRIS with ZPM client installed. ZPM client. Documentation. Online Demo of your project - 2 pointsCollect 2 more bonus points if you provision your project to the cloud as an online demo. You can do it on your own or you can use this template - here is an Example. Here is the video on how to use it. Article on Developer Community - 2 points Post an article on Developer Community that describes the features of your project and collect 2 points for the article. The Second article on Developer Community - 1 point You can collect one more bonus point for the second article or the translation regarding the application. The 3rd and more will not bring more points but the attention will all be yours. Code quality pass with zero bugs - 1 point Include the code quality Github action for code static control and make it show 0 bugs for ObjectScript. Video on YouTube - 3 points Make the Youtube video that demonstrates your product in action and collect 3 bonus points per each. The list of bonuses is subject to change. Stay tuned! Good luck in the competition! Things I mentioned in the kickoff webinar: %SQL.AbstractFind/%Library.FunctionalIndex implementations:Semantic version index:https://github.com/intersystems-community/zpm/blob/master/src/%25ZPM/General/SemanticVersion/Index.clshttps://github.com/intersystems-community/zpm/blob/master/src/%25ZPM/General/SemanticVersion/Find.clshttps://github.com/intersystems-community/zpm/blob/master/src/%25ZPM/Repo/Filesystem/Cache.clsSpatial index: https://github.com/intersystems-ru/spatialindexImage color index: https://openexchange.intersystems.com/package/iris-image-index-demoInspiration for a project:Implement a hierarchical index that operates on a table with a self-referential field (e.g., an employee table with a manager field) to return (via a %SQL.AbstractFind implementation) all records above (directly/indirectly), below (directly/indirectly), or in the same tree (or graph - need to consider circular references) as a given record. r we planing to add columnar/time-series/graph into IRIS?
Announcement
Bob Kuszewski · Apr 1, 2022

Using InterSystems IRIS containers with Docker 20.10.14+

Docker 20.10.14 (released March 23, 2022) changes the Linux capabilities given to containers in a manner that is incompatible with the Linux capability checker in InterSystems IRIS 2021.1 (and up) containers. Users running Docker 20.10.14 on Linux will find that IRIS 2021.1+ containers will fail to start and the logs will incorrectly report that required Linux capabilities are missing. For example: [ERROR] Required Linux capability cap_setuid is missing. [ERROR] Required Linux capability cap_dac_override is missing. [ERROR] Required Linux capability cap_fowner is missing. [ERROR] Required Linux capability cap_setgid is missing. [ERROR] Required Linux capability cap_kill is missing. [FATAL] Your IRIS container is missing one or more required Linux capabilities. Resolution Users experiencing this problem will need to adjust the command line passed to the container’s entrypoint to disable checking for Linux capabilities. From the command line, add --check-caps false after the image in your docker run or docker start command. For example: docker run containers.intersystems.com/intersystems/iris-community:2022.1.0.152.0 --check-caps false If you're using docker-compose, the corresponding change would be as follows: command: --check-caps false The capability check acts as a way of checking for common misconfigurations before starting the IRIS processes. Disabling the Linux capability check has no impact on the IRIS processes running in the container. More Reading Docker 20.10.14 release notes Running InterSystems Products in Containers In the docker-compose file the command is still command: --check-caps false If the = is left in the command the following error will be returned PARSE ERROR: Argument: --check-caps=false iris_1 | Couldn't find match for argument | Brief USAGE: iris_1 | /iris-main [--ISCAgentPort <integer>] [--ISCAgent <bool>] [--check-caps iris_1 | <bool>] [-k <license key>] [-L <<licenseID> <host1>,<port1>[ iris_1 | ,<dir1>] [<host2>,<port2>[,<dir2>]]>] [-p <password file>] iris_1 | [-t <command>] [-c <command>] [-e <command>] [-a <command>] iris_1 | [-b <command>] [-l <log file>] [-s <bool>] [-u <bool>] [-d iris_1 | <bool>] [-i <instance>] [--] [--version] [-h] iris_1 | iris_1 | For complete USAGE and HELP type: iris_1 | /iris-main --help Thanks Bob for the timely post. If you're using IKO, you can pass the "--check-caps false" argument in your iriscluster yaml like this: apiVersion: intersystems.com/v1alpha1 kind: IrisCluster metadata: name: ephelps-1 spec: licenseKeySecret: name: license-key configSource: name: iris-cpf imagePullSecrets: - name: docker-secret updateStrategy: type: RollingUpdate topology: data: mirrored: true shards: 1 image: containers.intersystems.com/intersystems/iris:2021.2.0.651.0 podTemplate: spec: args: - --check-caps - "false" serviceTemplate: spec: type: LoadBalancer externalTrafficPolicy: Local version: '3.6' services: iris: build: context: . dockerfile: Dockerfile restart: always command: --check-caps false ports: - 1972 - 52773:52773 - 53773 volumes: - ./:/irisrun/repo Using cap-add might allow for a more fine-grained control: --cap-add SETUID --cap-add DAC_OVERRIDE --cap-add FOWNER --cap-add SETGID --cap-add KILL Or in docker compose: version: '2' services: iris: cap_add: - SETUID - DAC_OVERRIDE - FOWNER - SETGID - KILL Please, next time, when you spontaneously add flags and remove flags or features that prevent starting IRIS in Docker, think about end-users, who would need, to run different versions of IRIS, it makes it more complicated to follow all those changes. One version does not work with flags, another does not work with this flag. We need something more stable. When I need to configure the CI process for multiple versions, now I should somehow decide which version has this flag and which has not. How would I go about creating an image using a Dockerfile that is based on one of these images? How can I get the docker build to include the --check-cap false? Hi Mike! You can check this or that example, the simplest dockerfiles with IRIS. The command with check-caps false can be found e.g. here in Docker-compose Glad this was the first Google result for "docker required linux capability is missing"
Announcement
Evgeny Shvarov · Jun 1, 2022

Technical Bonuses Results for InterSystems Grand Prix Contest 2022

Hi developers! Here is the score of technical bonuses for participants' applications in the InterSystems Grand Prix 2022 programming Contest! Project InterSystems FHIR IntegratedML Native API Interoperability Production EXtension Embedded Python AtScale Tableau, PowerBI, Logi InterSystems IRIS BI Docker ZPM Online Demo Unit Testing First Article on DC Second Article on DC Code Quality Video on YouTube Total Bonus Nominal 5 4 3 3 4 5 4 9 3 2 2 2 2 2 1 1 3 55 db-migration-using-SQLgateway 2 2 2 6 CrossECP-IRIS 2 2 2 1 7 M-N-Contests 2 2 2 2 1 1 3 13 cryptocurrency-rate-forecasting 0 FHIR Patient Viewer 5 2 3 10 IRIS import manager 3 2 2 7 test-data 3 5 2 2 2 2 2 1 19 Docker InterSystems Extension 2 3 5 apptools-infochest 2 2 2 2 8 iris-mail 3 5 2 2 2 2 1 17 production-monitor 3 2 2 7 iris-megazord 5 3 2 2 2 2 2 1 3 22 apptools-admin 2 2 2 6 webterminal-vscode 2 2 ESKLP 3 2 2 7 Disease Predictor 4 2 2 2 1 3 14 iris-fhir-client 5 5 2 2 2 2 1 3 22 Water Conditions in Europe 5 4 9 3 2 2 2 1 3 31 FHIR Pseudonymization Proxy 5 3 2 2 12 ObjectScript-Syntax-For-GitLab 2 2 1 5 CloudStudio 2 3 5 FIT REST Operation Framework 3 2 2 7 Bonuses are subject to change upon the update. Please claim here in the comments below or in the Discord chat. My app Disease Predictor has YouTube video. It is already added at the end of OEX app page description (https://openexchange.intersystems.com/package/Disease-Predictor). So I claim youtube bonus. I've added YouTube video and added it at the description of OEX Application https://openexchange.intersystems.com/package/Water-Conditions-in-EuropeAlso two related articles posted to DC, linked to application, please count. And the last question is about bonuses for Tableau, PowerBI, Logi. According to The Rules 3 points count for each of that systems. I've used all them 3 in Contest App. I've added YouTube video and 2nd Article for iris-fhir-client app (https://openexchange.intersystems.com/package/iris-fhir-client) .So please consider it. Thanks Added zpm/docker support (though struggling w/ M1 docker a bit I think) Hi @Craig.Regester! This is great! Please submit the app with the ZPM option on OEx to make it available for everyone!
Article
Oliver Wilms · Dec 24, 2021

InterSystems SQL Outbound Adapter - How fast can it go?

One of my colleagues had developed an interface in Health Connect (HealthShare 2019.1) to add large amounts of data to an external SQL Server database. The data comes from many text files with delimited rows and data for one table per file. There is a business process to read a file line by line and send an Insert Request to an operation. The request contains an Insert statement like ‘Insert into TABLE columns (col1, col2, … colZ) values (val1, val2, … valZ).’ The Health Connect operation utilizes Outbound SQL Adapter to insert one row into a table per request. You can probably imagine this process takes quite a long time. I believe it took about 4 hours to insert 200000 rows into one table. That is 50000 rows in one hour, which is 3600 seconds, or about 14 rows per second. I saw on Open Exchange that Guillaume Rongier had developed Grongier.SQL.OutboundAdapter. I understand this code uses an Insert statement like ‘Insert into TABLE columns (col1, col2, col3) values (?, ?, ?)’ paired with an array consisting of number of rows, number of columns per row, data values and data types. I had to tweak the code a bit to make it run in HealthShare 2019.1. I learned a lot about InterSystems SQL classes by debugging the code. It did not really work for me with reliability. I think I tried to insert a batch of 5 rows into two different tables. It worked with one table, but with the other table it inserted only one row and the return value indicated no row had been inserted. I believe it was Dmitry Maslennikov who suggested to me that I could use an Insert statement like ‘Insert into Table columns (col1, col2, col3) values (valA1, valA2, valA3), (valB1, valB2, valB3), (valC1, valC2, valC3).’ I refactored the business process to make one request per text file and the operation processed the stream line by line. I liked the idea to have all the values in the query statement, because I could use the standard InterSystems SQL Adapter with it. I observed that I could insert about 30 rows per second when I combined the values from two rows into one Insert statement. I was surprised that it did not make any significant difference if I inserted 20 columns per row or 90 columns per row. It made sense to me that I could insert about twice as many rows per second when I inserted two rows per insert compared to inserting rows one by one. I wanted to see how fast I could insert rows if I combined more rows into one insert statement. Here are the results: Batch Size Insert Rate 3 45.90 4 57.03 5 62.73 6 78.42 7 94.10 8 101.73 9 129.79 When I tried to insert rows by ten at a time (Batch Size = 10), the processing time was the same as nine rows per insert. I was able to insert nearly 130 rows per second, almost ten times what the original process provided. I also need to delete data before inserting new data. For some tables we delete all the rows, for some tables we delete only the rows that are being updated. I am not sure why we ‘Delete TABLE where col1 = val1’ and then ‘Insert into TABLE columns (col1, …) values (valNew1, …).’ I think this could probably be accomplished quicker by an update statement. However, I was pleased to see I could delete thousands of rows in less than one second with a single delete statement like ‘Delete TABLE where SiteID = 123.’ I have not yet collected metrics comparing deleting individual rows with inserting individual rows. The refactored process refers to UPDATE logic when it uses an Insert statement like ‘Insert into Table columns (col1, col2, col3) values (valA1, valA2, valA3), (valB1, valB2, valB3), (valC1, valC2, valC3)’ AFTER deleting any rows matching the rows to be inserted. We have identified key columns per table to identify records for the delete. Assuming a table uses key columns col1, col2, and col3, I will combine the key values from multiple rows using OR condition like shown below for a batch size of three rows: Delete TABLE where (col1 = valA1 AND col2 = valA2 AND col3 = valA3) OR (col1 = valB1 AND col2 = valB2 AND col3 = valB3) OR (col1 = valC1 AND col2 = valC2 AND col3 = valC3)
Announcement
Anastasia Dyubaylo · Feb 9, 2022

[Video] Using the VS Code Debugger for InterSystems ObjectScript

Hey Developers, New video is already on InterSystems Developers YouTube channel: ⏯ Using the VS Code Debugger for InterSystems ObjectScript See how VS Code’s debugger for InterSystems ObjectScript helps you step through and inspect code. Learn how to write launch configurations for debugging class methods and production components, and get an overview of the VS Code debugger interface—including the variables section, watch pane, and debug console. Enjoy and stay tuned!
Question
Ben Spead · Feb 3, 2022

How to determine the UNIX user/group that InterSystems IRIS is running as?

(I wasn't able to find this in the docs or the Community, so feel free to point me to a reference that I missed) How can I determine the effective User and Group that will be used when an InterSystems IRIS process is doing file I/O on the file system for UNIX? Bonus points if you can tell me how to do it from within InterSystems IRIS as well as from the host OS. Thanks! From the OS side in AIX, I can see it in parameters.isc (example from a QA env I'm playing with) security_settings.iris_user: irisusr security_settings.iris_group: irisusr security_settings.manager_user: irisusr security_settings.manager_group: irisusr I do not recall how to see it in IRIS itself (or if it's even possible) but I remember wanting to figure out how to change the values after installation (due to someone goofing up an entry on a dev environment) and without a lot of effort, it is pretty difficult. Thank you @Craig.Regester for the response. Looking up that file in the docs (https://docs.intersystems.com/iris20201/csp/docbook/DocBook.UI.Page.cls?KEY=GCI_unixdist) it tells me that "For security reasons, the parameters.isc file is accessible only by the root user." I am pretty sure there is a way to tell what it is currently running as without needing that level of access. But it is good to know about this in the cases where root access is an option Interesting question. I didn't see anything for this in the class reference either. I'll be following this post. ##class(%SYS.ProcessQuery).GetOSUsername() You could try:ps -ax -o uname,cmd | grep "irisdb WD" | grep -v "grep"-ax will get all the running processes including ones that aren't running on a terminal, retrieve the username, and command that started the process. We then use grep to filter out the exact process we need. Thanks @Jean.Millette and @Timothy.Leavitt for the help with this! great way to do it within InterSystems IRIS - thanks Tim! Perfect!! Exactly what I was looking for - thank you @Sarmishta.Velury (and @Jean.Millette and @Timothy.Leavitt ) If you're doing file I/O, why not %File.GetOwnerGroup()? Or is this something you need to know before you open (or create) a file? @Jeffrey.Drumm - it is important to have this run from a process that is already running in the InterSystems IRIS instance (or something spun off from the SuperServer) so that it doesn't pick up your UNIX username if you enter via console. So being able to run an API like Tim's will work nicely as I can run it via the Output window from Studio: Understood ... but I'm curious as to how IRIS is getting my environment: w ##class(%SYSTEM.Util).GetEnviron("USER") jdrumm w ##class(%SYS.ProcessQuery).GetOSUsername() irisusr No idea, but I don't think it's tied to the IRIS name. When I am logged into Studio as bspead I see the following: [quote] w ##class(%SYSTEM.Util).GetEnviron("USER")rootw ##class(%SYS.ProcessQuery).GetOSUsername()cacheusr [/quote]
Announcement
Olga Zavrazhnova · Jul 22, 2021

Challenge on Global Masters: Try InterSystems FHIR Transformation Service

Hey Community, We are really looking for your feedback on a new offering - InterSystems FHIR Transformation Service. It went live on AWS Marketplace where you can try it for free! We launched a related challenge on GM where you can get points for giving it a try and a "thank you" prize to everyone who leaves feedback in comments to this post. If you are not GM member, you can do following and also require your "thank you" prize: #1 ✅ Try it out - here's a step-by-step guide. Would be so much value for us if you test it with your own HL7! #2 ✅ Send me a screenshot of your status page for a pipeline showing both your username and a Live pipeline that has processed at least one message. Screenshot should look like this: #3 ✅ What worked well? Any issues? Will you use it? Leave feedback in the comments to this post. We are VERY interested in seeing people try this service and provide us with specific feedback on how it might bring value to them and their organization. Looking forward to see your feedback!
Article
Ron Sweeney · Jul 29, 2021

BILLIONS - Monetizing the InterSystems FHIR® with Google Cloud's Apigee Edge

We are ridiculously good at mastering data. The data is clean, multi-sourced, related and we only publish it with resulting levels of decay that guarantee the data is current. We chose the HL7 Reference Information Model (RIM) to land the data, and enable exchange of the data through Fast Healthcare Interoperability Resources (FHIR®). We are also a high performing, full stack team, and like to keep our operational resources on task, so managing the underlying infrastructure to host the FHIR® data repository for purposes of ingestion and consumption is not in the cards for us. For this, we chose the [FHIR® Accelerator Service](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=FAS) to handle storage, credentials, back up, development, and FHIR® interoperability. Our data is marketable, and well served as an API, so we will **monetize** it. This means we need to package our data/api up for appropriate sale — which includes: a developer portal, documentation, sample code, testing tools, and other resources to get developers up and running quickly against our data. We need to focus on making our API as user-friendly as possible, and give us some tooling to ward off abuse and protect our business against denial service attacks. For the customers using our data, we chose to use [Google Cloud's Apigee Edge](https://apigee.google.com/edge). ![image](/sites/default/files/inline/images/venmo2.png) > ### With our team focused and our back office entirely powered as services, we are set to make **B I L L I O N S**, and this is an account as to how. # Provisioning High level tasks for provisioning in the [FHIR® Accelerator Service](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=FAS) and [Google Cloud's Apigee Edge](https://apigee.google.com/edge). ## FHIR® Accelerator Service Head over to the AWS Marketplace and subscribe to the InterSystems FHIR® Accelerator Service, or sign up for a trial account directly [here](https://portal.trial.isccloud.io/account/signup). After your account has been created, create a FHIR® Accelerator deployment for use to store and sell your FHIR® data. ![image](/sites/default/files/inline/images/fhiraas2.gif) After a few minutes, the deployment will be ready for use and available to complete the following tasks: 1. Create an API Key in the Credentials section and record it. 2. Record the newly created FHIR® endpoint from the Overview section. ![image](/sites/default/files/inline/images/fhiraas4.png) ![image](/sites/default/files/inline/images/fhiraas5.png) ## Google Cloud Apigee Edge Within your Google Cloud account, create a project and enable it for use with Apigee Edge. To understand a little bit of the magic that is going on with the following setup, we are enabling a Virtual Network to be created, a Load Balancer, SSL/DNS for our endpoint, and making some choices on whether or not its going to be publicly accessible. > Fair warning here, if you create this as an evaluation and start making M I L L I O N S, it cannot be converted to a paid plan later on to continue on to making B I L L I O N S. ![image](/sites/default/files/inline/images/apigee1.png) ![image](/sites/default/files/inline/images/apigeetwo_0.png) ![image](/sites/default/files/inline/images/apigeethree.png) ## Build the Product Now, lets get on to building the product for our two initial customers of our data, Axe Capital and Taylor Mason Capital. ![image](/sites/default/files/inline/images/drawing.png) ### Implement Proxy Out first piece of the puzzle here is the mechanics of our proxy from Apigee to the FHIR® Accelerator Service. At its core, we are implementing a basic reverse proxy that backs the Apigee Load Balancer with our FHIR® API. Remember that we created all of the Apigee infrastructure during the setup process when we enabled the GCP Project for Apigee. ![image](/sites/default/files/inline/images/apiproxy.gif) ### Configure the Proxy Configuring the proxy basically means you are going to define a number of policies to the traffic/payload as it either flows to (PreFlow/PostFlow) to shape the interaction and safety of how the customers/applications behave against the API. In the below, we configure a series of policies that : 1. Add CORS Headers. 2. Remove the API Key from the query string. 3. Add the FHIR® Accelerator API key to the headers. 4. Impose a Quota/Limit. ![image](/sites/default/files/inline/images/flow.png) A mix of XML directives and a user interface to configure the policy is available as below. ![image](/sites/default/files/inline/images/configureproxy.gif) ### Add a Couple of Developers, Axe and Taylor We need to add some developers next, which is as simple as adding the users to any directory, this is required to enable the Applications that are created in the next step and supplied to our customers. ![image](/sites/default/files/inline/images/developers.png) ### Configure the Apps, one per customer Applications is where we break part our *product* and logically divide it up to our customers, here we will create one app per customer. Important note here that in our case for this demonstration, this is where the apikey for that particular customer is assigned, after we assign the developer to the app. ![image](/sites/default/files/inline/images/apps.gif) ### Create the Developer Portal The Developer Portal is the "**clown suit**" and front door for our customers and where they can interact with what they are paying for. It comes packed with some powerful customization, a specific url for the product it is attached to, and allows the import of a swagger/openapi spec for developers to interact with the api using swagger based implemented UI. Lucky for us the Accelerator Service comes with a swagger definition, so we just have to know where to look for it and make some modifications so that the defs work against our authentication scheme and url. We don't spend a lot of time here in the demonstration, but you should if you plan on setting yourself apart for the paying customers. ![image](/sites/default/files/inline/images/portal.gif) ### Have Bobby Send a Request Let's let Bobby Axelrod run up a tab by sending his first requests to our super awesome data wrapped up in FHIR®. For this, keep in mind the key that is being used and the endpoint that is being used, is all assigned by Apigee Edge, but the access to the FHIR® Accelerator Service is done through the single key we supplied in the API Proxy. ![image](/sites/default/files/inline/images/axerequest.gif) ![image](/sites/default/files/inline/images/showmethemoney.png) ### Rate Limit Bobby with a Quota Let's just say one of our customers has a credit problem, so we want to limit the use of our data on a rate basis. If you recall, we did specify a rate of 30 requests a minute when we setup the proxy, so lets test that below. ![image](/sites/default/files/inline/images/quota.gif) ### Bill Axe Capital I will get in front of your expectations here so you wont be too disappointed by how rustic the billing demonstration is, but it does employ a technique here to generate a report for purposes of invoicing, that actually removes things that may or may not be the customers fault in the proxy integration. For instance, if you recall from the rate limit demo above, we sent in 35 requests, but limited things to 30, so a quick filter in the billing report will actually remove those and show we are competent enough to bill only for our customers utilization. ![image](/sites/default/files/inline/images/billing.gif) To recap, monetizing our data included: * Safety against abuse and DDOS protection. * Developer Portal and customization for the customer. * Documentation through Swagger UI. * Control over the requests Pre/Post our API ... and a way to invoice for **B I L L I O N S**. This is very cool. Well done. 💡 This article is considered as InterSystems Data Platform Best Practice.
Article
Anastasia Dyubaylo · Oct 8, 2021

How to learn on InterSystems Developer Community? Part 2: Tags

Hi Dev Community members, In this post, we would like to show you how to use DC tags. Let's make the most of this Developer Community option! A tag is a word or phrase that describes the topic of the post. Tags are a means of connecting members and experts with posts they will be able to discuss/ give the right answer by sorting posts into specific, well-defined categories. Tags can also be used to help you identify posts that are interesting or relevant to you. You can find the full list of tags in the Tags section of the DC top menu: Types of Tags and Dev Community Tag Tree There are two types of Dev Community tags: Groups – so-called main tags for broad topics and include all InterSystems technologies. Tags – regular tags for more specialized topics. Each post must have at least one of these groups. Do you know all the groups? A tag group for each InterSystems technology (9): A tag group for Visual Studio Code, the popular cross-platform from Microsoft: A tag group for official announcements about the DC or InterSystems: A tag group for advisories and alerts from the Worldwide Response Center (WRC): A tag group for Open Exchange (InterSystems gallery of software solutions and frameworks built with/for InterSystems), another one for Global Masters (InterSystems Gamification Platform), and another one for the Partner Directory (InterSystems platform for customers and partners): A tag group for Global Summit, the InterSystems annual meeting: Tag groups for Online Learning and Documentation: A tag group for comments, opinions, suggestions... about the DC: A tag group for job opportunity announcements related to InterSystems technology: And a tag group alternative to the rest, for those posts that can't be tagged with any of the previous tags: In addition to groups, DC members use Tags to specify even more the content of the posts. In the DC Tag Tree, you can also find some subtags, categorizing the content of the tags. As an example, the "Languages" tag has these subtags: "C++", "Python", "JavaScript", "MultiValue Basic", "ObjectScript", "Java" and ".NET". It is not mandatory to add Tags to posts, but you must select at least one Group: Sorting Tags You can sort tags in three different ways using the DC Tag Tree: 1. By popular: Groups & Tags are sorted by the number of times they have been used in posts. This number appears next to each tag (in parentheses). For example, the Open Exchange tag has been used in 368 posts: 2. By name: Groups & Tags are sorted alphabetically. 3. By new: By selecting this sort, the most recently created Groups & Tags will be shown first. Tag page: follow, sort, filter posts with Tags Each tag has its own URL/webpage, where you can see all the posts that have used that tag. For example, the "XML" tag has this webpage: community.intersystems.com/tags/xml, showing all the posts using this tag: All posts can be filtered by different criteria on the Tag page: by update, by date, by liker, by views, or by replies. They can also be sorted by post type: announcements, articles, questions, discussions, videos, or jobs. You need to go to the menu in the upper left corner and select the post type you are looking for. Follow the tags you are interested in! If you are interested in a subject, you can look for its tag in the DC tag tree, select it and click on the "Follow" button next to it. When you follow any tag, you will receive emails with all posts using that tag. Tags we suggested to start from: Best practices | Tips and tricks | Beginner | Tutorial. So... Take a look at the DC Tag Tree right now – interesting topics (tags) and a ton of useful content are waiting for you: read all published posts on the topic of your interest; follow the tags so you don't miss any future posts on your favorite topics. If you have any questions about the tags or you miss anyone, please leave your comments/suggestions below! Very interesting, thank you!
Announcement
Anastasia Dyubaylo · Oct 12, 2021

Video: Fast & Efficient Provisioning & Testing with InterSystems Cloud Manager

Hi Community, New video is already on InterSystems Developers YouTube: ⏯ Fast & Efficient Provisioning & Testing with InterSystems Cloud Manager See how the powerful InterSystems Cloud Manager tool supports cloud deployment — both with and without containers — for continuous testing and deployment phases. The Cloud Manager can be used for both pre-production and production situations, as it natively implements InterSystems best practices. Cloud Manager leverages an intuitive declarative format for easy cloud and on-premises deployment of InterSystems IRIS clusters configurations. 🗣 Presenter: @Steve.Pisani, Senior Solution Architect, InterSystems Enjoy and stay tuned!
Announcement
Shane Nowack · Oct 18, 2021

Earn money by helping InterSystems Certification write exam questions!

The InterSystems Certification Team is building an InterSystems IRIS Integration Specialist certification exam and is looking for Subject Matter Experts (SMEs) from our community to help write questions. You, as a valued InterSystems community member, know the challenges of working with our technology and what it takes to be successful at your job. In exchange for your assistance you will be compensated up to $500 per work assignment. A work assignment will typically involve writing 20 assigned questions in a two-week time frame, and having your submitted questions reviewed within two weeks of submission. The time expectation for completing a work assignment is approximately 20 hours. Proposed Project Work Dates: The two-week work assignments will be issued in stages during Q1 and Q2 of 2022 and will be assigned by the Certification Team. Note: Writing questions for InterSystems Certification is paid, temporary contract work based in the United States. As such, to participate you must be eligible to accept paid work projects in the United States. You will be required to sign the InterSystems Vendor Agreement and complete a U.S. tax declaration form (W-9). Here are the details: Action Item Details Complete project profile Write to certification@intersystems.com to express your interest in the Certification Subject Matter Expert Program. Tell us that you are interested in being an InterSystems IRIS Integration SME (an individual with at least two years of experience with InterSystems IRIS Integration tasks). A team member will send you a profile form to determine if your areas of expertise align with open projects. Accept If you are selected for an exam development opportunity, a team member will email you several forms requiring your signature: a Statement of Work, the InterSystems Vendor Agreement, Form W-9, and a Non-Disclosure Agreement. Train After receiving your signed documents, and before beginning to write questions, you will be asked to watch a short training video on question-item writing and to complete a Job Task Analysis (JTA) survey. Completion of this survey takes approximately 30-45 minutes and is required. Your responses will help us validate exam topics and create your item-writing assignment. Participate After receiving your JTA survey the Certification Team will send you information regarding your first assignment. This will include: credentials to access and sign in to QuestionMark, our SME item-writing development system, and a work assignment, which usually consists of the submission of 20 scenario-based questions. You will typically be given two weeks to complete the assignment. Review InterSystems staff will review your content. InterSystems may accept, reject, or request revision to any question at its sole discretion. You may be asked to resubmit a question if the reviewer sees problems with the question item and has a clear solution for how to resolve it. This may include: conceptual problems, such as a technical detail in the question stem is assumed or missing, or a particular use case that invalidates the question, or if they believe there is a different question rationale that most experts would assume is the best way to assess the target item. A question may be rejected if the reviewer disagrees fundamentally with the question rationale as valid, or if they believe the investigation to fix the question requires unrealistic work. Receive payment At the end of the item-writing project you will receive a statement from InterSystems showing questions accepted by internal reviewers. You will receive payment for the accepted items within 30 days of the end of the item-writing project. If for any reason, only a portion of the work package has been accepted, you will receive a pro-rated amount of the value of the work package. Interested in participating? Email certification@intersystems.com now!
Article
Nikolay Solovyev · Nov 23, 2021

InterSystems Package Manager ZPM 0.3.2 release

A new release of ZPM has been published - ZPM 0.3.2. New in this release: Various changes in the output command of help Changes in colors in the outputs Added an ability to add more repo types Added an ability to specify a post-installation message, with AfterInstallMessage tag in module.xml Added variable ${webroot}, which refers to url with host and port where the internal web-server is available Fixed issue when during install if no module was specified (issue #243) Fixed issue with uppercased FileCopy resource Some other minor bugfixes How to use AfterInstallMessage ? Described in Documentation. And here is an example.
Announcement
Anastasia Dyubaylo · Nov 29, 2021

Video: InterSystems HealthShare Health Connect: New & Next

Hey Developers, In the next video from #VSummit21 we'll show you recent changes to InterSystems HealthShare Health Connect and what is coming next: ⏯ InterSystems HealthShare Health Connect: New & Next 🗣 Presenter: @Stefan.Wittmann, Product Manager, InterSystems Subscribe to the InterSystems Developers YouTube channel and stay tuned!