DHIS version 2.34 is released

Dear all,

DHIS2 version 2.34 is out with many new features, apps, improvements and bug fixes. This version is fully compatible with the version 2.1 Android Capture App.


ANALYTICS FEATURES

Pivot tables in Data visualizer app: The Data visualizer app now supports pivot tables, meaning the functionality of the pivot table app is merged into the data visualizer app. A pivot table is now just another visualization type within the data visualizer app. This provides users with a more intuitive experience for building pivot tables, and it more seamlessly allows moving between pivot tables and other chart types. The performance of pivot tables is also dramatically improved, allowing for very large pivot tables with at least three times more data than the classic pivot table app.

Jira | Screenshot 1 | 2 | 3

Dimension recommendations: In the data visualizer app, pivot tables now support “dimension recommendations”, which means that dimensions which are relevant to the select data elements will be indicated in the left panel with a green dot.

Screenshot

Continuous analytics table update: The analytics table scheduler now supports continuous updates of analytics tables, offering a “real-time analytics” experience. The delay between data being entered and data becoming visible in analytics apps will now be in seconds, compared to hours or days. A new table partition which contains the latest data is introduced which allows for quicker updates. This can be configured in the Scheduler app by selecting the Continuous analytics table job type. The Delay in seconds field refers to the delay in seconds in between each update of the latest data partition. The Full update hour of day field refers to the time of the day at which the full analytics table update will run.

Screenshot | Docs

Progressive caching: Progressive caching reduces the time to render dashboards and speeds-up analytics by creating a new cache layer. Essentially this enables data to be viewed in the analytics immediately after being entered without running the analytics tables.

Jira

Legends for single values: Legends can now be added to single value chart types. The text color of the value is decided by the legend that the value falls within. This enables users to more effectively communicate the relative performance of values.

Jira | Screenshot

Improved gauge charts: The usefulness of gauge charts has been dramatically improved. Now a gauge chart can include baselines and target lines, a legend that will change the color of the chart based on the value shown, and minimum and maximum data ranges.

Jira 1 | 2 | 3 | Screenshot 1 | 2

Sort by totals in pivot tables: You can now sort by subtotal and total columns in pivot tables.

Screenshot

Dashboard item visual improvements: Each dashboard item has text wrapping for long names. All dashboard item options are now available as a menu instead of icons, giving more space for the title and makes titles more visible in the dashboard.

Screenshot

Pivot table and chart type visualization filter: In the list of visualizations, a visualization type filter is available and lets you filter by pivot tables and charts. An icon representing the visualization type is displayed for each row in the list, making it quick to see the type for each visualization.

Jira | Screenshot

Maps enhancements and WebGL: The mapping engine in version 2.34 is brand-new and based on the WebGL technology which is much more performant compared to the previous solution.

Jira

The following key features are now available in Maps:

  • Performance: We are now capable of showing thousands of features on a map simultaneously, and the maps are much more responsive.

    Screenshot

  • Map rotation and tilting: You can now rotate and tilt the map to enhance the view of your data.

    Screenshot

  • Continuous zoom: The zoom is now continuous, allowing you to fit the map perfectly to your content and avoids the previously large zoom “steps”.

  • Full-screen view: Maps can now be viewed in full-screen mode. This is especially useful for dashboard maps where space is limited. You can click the full-screen button on the right side of the map to enable it.

  • Bing Maps: Google Maps is no longer supported due to technical and legal issues, but we have included four new base maps from Bing, which should be a good replacement.

    Screenshot

  • Donut clusters: We have added support for “donut clusters” which will show you the event cluster distribution if you style by a data element.

    Screenshot


TRACKER AND EVENT FEATURES

Performance and stability improvements: A range of improvements have been made related to performance and security:

  • Tracker capture performance: Jira
  • Monitoring Infrastructure: Jira
  • Improved caching: Jira
  • Various bug fixes: Jira
  • Antlr parsing of program rules: Jira

Enhanced audit service: An audit trail is now stored for all types of metadata and data. The audit trail is enabled by default and is configurable in this dhis.conf configuration file. The solution is centralized and is based on the Apache ActiveMQ Artemis asynchronous message broker. The audit solution covers create, read, update and delete operations across metadata, aggregate data and tracker data. Audit logs can currently be retrieved from the audit table in the DHIS2 database.

Jira | Docs

Predefined event views in Capture app: In the capture app it is now possible to save and share custom predefined list views/event filters. A user can save a named filter based on any otherwise filterable attributes like event data values, event dates, assignees, and so on. This can be a private filter or shared so that other users can see and utilize it. One use case for such filters can be to create a default working list of events assigned to the logged in user.

Jira | Screenshot | Docs

Tracker capture search for relatives: It is now possible for a user to search for and link a relationship to any tracked entity instance in their search scope. Previously it was only possible to search and link relationships within the users reporting organization unit. Searching across different organizations is useful in Covid-19 contact tracing where the contacts might live in another part of the country.

Jira | Screenshot | Docs


APPS FEATURES

Data approval: The data approval functionality is re-introduced as a separate app called Data approval. It offers the same functionality which was previously accessible through the Reports app. It allows for approving data by data set and time period. We are working on a new approval app using our new technology stack which will support the data approval workflow model.

Screenshot

App Hub: The App Store has been rebranded as the App Hub. The App Hub has been rewritten to support improved management of apps. DHIS2 2.34 uses the new App Hub (https://apps.dhis2.org) by default. Apps from the old App Store have been migrated to the new App Hub where possible. The old App Store link, used by previous versions of DHIS2, will continue to work, but will be seamlessly redirected to the new App Hub in the near future. App developers should now use the new App Hub for sharing your apps.

https://apps.dhis2.org

Attribute ID schemes in data import-export: The import-export app now allows for selecting attribute-based identifier schemes for data import and export.

Screenshot | Jira


API FEATURES

New combined endpoint for analytics visualizations: The reportsTables and charts endpoints have been deprecated in favour of a new and consolidated visualizations endpoint.

Docs


RELEASE INFO

Release Information Links
Download release and sample database https://www.dhis2.org/downloads
Documentation and Javadocs https://www.dhis2.org/documentation
Upgrade notes Upgrade notes for 2.34 on GitHub
Details about each feature on JIRA (requires login) 2.34 Features
Overview of bugs fixed on JIRA (requires login) 2.34 Bugs
Source code on Github https://github.com/dhis2
Demo instance https://play.dhis2.org/2.34.0/
Docker docker pull dhis2/core:2.34.0
for more docker image variants see dockerhub
11 Likes

This is great news for DHIS2 Users. Many thanks to the Developers who have worked round-the-clock to make this happen.

1 Like

Wow, Great news Philip. I thank you guys for the great work.

1 Like

Hi @phil, thanks for 2.34 version.

And I have problem with 2.34.


HTTP Status 500 - Filter execution threw an exception
type Exception report

message Filter execution threw an exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Filter execution threw an exception
org.hisp.dhis.servlet.filter.HttpUrlPatternFilter.doFilter(HttpUrlPatternFilter.java:120)
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:156)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
root cause

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.changeSessionId()Ljava/lang/String;
org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy.applySessionFixation(ChangeSessionIdAuthenticationStrategy.java:40)
org.springframework.security.web.authentication.session.AbstractSessionFixationProtectionStrategy.onAuthentication(AbstractSessionFixationProtectionStrategy.java:87)
org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy.onAuthentication(ChangeSessionIdAuthenticationStrategy.java:28)
org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy.onAuthentication(CompositeSessionAuthenticationStrategy.java:89)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.hisp.dhis.security.filter.CustomAuthenticationFilter.doFilter(CustomAuthenticationFilter.java:69)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:180)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.hisp.dhis.security.filter.AutomaticAccessFilter.doFilter(AutomaticAccessFilter.java:115)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:152)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
org.hisp.dhis.servlet.filter.HttpUrlPatternFilter.doFilter(HttpUrlPatternFilter.java:120)
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:156)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)


Br,
Taufiq

@taufiqhs This looks like you have a version of Tomcat (and the Servlet API) or JDK which is too old. We now require Tomcat 8.5.50 and Java 8. Please open a new thread for this outside the 2.34 released thread, or open a Jira ticket at jira.dhis2.org.

2 Likes

Hai @Lars

Thanks, I will check and test.

Taufiq

1 Like

Hi Taufiq

Tomcat 9 should also be fine. There are a few weirdnesses around
logging on debian based distributions, but it works well.

2 Likes

Hai Taufiq,

Were you able to resolve this issue by upgrading your tomcat and java?

Please keep us posted on how it goes.

Best,

Morley

1 Like

Great work of improvements! I appreciate very much the Progressive caching, the Continuous analytics table update and many other improvements . It can be also vary useful the Predefined event views in Capture app in order to organize verification of the entered events and shared work.
I really appreciate all the work done in this hard period by the project leads and developer team! Thanks for your work!
But there are some issues in the old version 2.33 still present in the new 2.34 (I waited for the new version to test it). Here 2 of them I reported on Jira that hinder our work.

  1. [DHIS2-8730] Capture Web App - Event list Filter - type mismatch
    https://jira.dhis2.org/browse/DHIS2-8730
    (TO DO)
  • it don’t permit to search for a string of only digits in the event list filter - for example to find a record as some File Identifier with only numbers. If you have at least one letter, the problem doesn’t exist, but usually in some hospitals the file identifier is composed by only digits. The Predefined event views in Capture app can’t be used in many cases because of this problem.
  1. [DHIS2-8729] - Option Group Set - No dimension created
    https://jira.dhis2.org/browse/DHIS2-8729
    (OPEN)
  • will permit to create different groupings of ICD-10 diagnosis
  1. Classification/aggregation of the event diagnosis by ICD-10 Chapters (I to XXII) - see the WHO documentation https://icd.who.int/browse10/2019
  2. Classification/aggregation of the event diagnosis by ICD-10 letter - (A, B, C, …Z, U)
  3. Classification/aggregation of the event diagnosis by ICD-10 by the WHO Global Health Estimates (GHE) - https://www.who.int/healthinfo/global_burden_disease/en/
  4. Other aggregation of the Captured Events based on specific disease groups.

The feature is already described in the documentation - see
22.10.4 Create or edit an option group set
https://docs.dhis2.org/2.33/en/user/html/manage_option_set.html#create_option_group_set
but is still not working - the 2.34 documentation is the same for this item.

Thanks for your comprehension.

2 Likes

We upgraded one of our instances to 2.34 to test out the system. Since the upgrade, the datasets in the data entry app no longer load.
This is what shows in the browser console:

@stebu had reported this issue with this post

This is hindering any further interaction with this build.

Your help is greatly required.

Thank you.

1 Like

Did you follow the upgrade notes from this link https://github.com/dhis2/dhis2-releases/blob/master/releases/2.34/README.md, before upgrading,I can see you installed the right tomcat,but did you perform this process * Remember to drop SQL views from Apps > Data administration > Maintenance > Drop SQL views before upgrading and to recreate them after the upgrade is completed. This is to avoid database integrity issues during the upgrade process, as database tables/columns with associated views cannot be modified.Because obviously it’s an upgrade they are bound to be altercations in the code,so if their is; it might probably affect the database structure…Which is why they’ve said you should perform the process explained above,to avoid integrity issues while the process is upgrading.If you followed that process and you still have that error ,then from my experience 504 error is a connectivity issue , so you should probably contact your hosting service were the postgresql database is been hosted for reasons why your application is not getting response from their server…If basic fixes can make it work like firewall or server issues.If that’s not the case …pls confirm from the person that did the upgrade if he or she can downgrade again and follow the required process to upgrade

Hi @Akinrotimi
Thanks for your suggestions. I indeed followed the recommended process to drop views before performing the upgrade.
Interestingly, we’ve used this instance for quite a while now, so I doubt if the issue is firewall related as there have been no changes to our configs.
I’ll keep looking though. Have you gone through similar upgrade successfully? Would it be possible to get samples of server.xml and content.xml files for Tomcat 8.5

A similar issue we are experiencing after upgrading from 2.30 to either 2.33.4 or 2.34.0 the data entry app datasets don’t load … Our error is a bit different .*(storage quota exceeded )

In addition, the dhis2 capture app too doesn’t load …and no error is logged on the server logs

@stebu, you remember we were having some errors some weeks ago on 2.33.3 that were not showing up on the logs. We had thought it was something local but interesting to see that others are experiencing similar things.
Some concern though that it takes some time for any reasonable traction or technical response to these issues after they are posted on here, especially considering that some of the issues are deal breakers and prevent users from further interaction with especially the new systems.
I acknowledge that the technical experts are really busy but…

Hey James @jomutsani, you still here?

@Stian @Ameen

Is it possible for one of you look into the issues being reported here?

Solved now with Tomcat 9