Mi código fuente

Todo el código fuente disponible en este blog, y en mi repositorio de Bitbucket, lo ofrezco, para que pueda ayudar a otros. Utilízalo sin restricciones. Si no se menciona explícitmente, lo publico bajo licencia licencia MIT.

Utilízalo bajo tu responsabilidad, y nunca directamente en una ORG productiva.

Query Performance Detector

A medida que nuestra ORG crece, las consultas que inicialmente diseñamos (que quizás optimizamos o quizás no) pueden sufrir degradación. Pero no estoy hablando sólo de las Queries de los Developers con SOQL, estoy hablando de List  viewsReports y Dashboards que crean los usuarios.

Además, esta degradación se realiza en silencioinadvertida, y solo es visible con incidencias de rendimiento en Producción, cuando ya es demasiado tarde, y las acciones correctoras (creación de índices, re-organización de datos, etc.) no serán inmediatas.

Puedes encontrar una entrada del blog con su explicación en  Query Performance Detector y el código en este disponible en este repositorio QPD-SourceCode.

Cuadro de Mando Multi-ORG

En cierto proyecto tuve la necesidad de proporcionar información sobre las licencias y uso de las ORG/s para que el cliente lo tuviera actualizado regularmente.

Al principio, accedía a cada una de ellas para obtener la info refrescando informes, consultando pantallas, etc., pero pronto me pareció repetitivo y tedioso. Analizando la API de Salesforce, me pareció que era posible acceder a mucha de la información que necesitaba.

Después de analizar la alternativa, confirmé que ejecutando queries a los objetos adecuados de Salesforce es posible obtener información desde cualquier aplicación que pueda utilizar la API.

Esta es una aplicación Java sencilla para obtener los datos de Salesforce, y el framework Bootstrap para mostrar los resultados en una interfaz de usuario, que no dependa de nula habilidad como diseñador.

Puedes encontrar una entrada explicativa en Cuadro de mando multi-ORG y código completo y libre en este repositorio: Cuadro Manto MultiORG

Planificador Dinámico de Procesos

Aún siendo muy potentes las capacidades asíncronas de Salesforce, encontré la necesidad de exprimir al máximo y con mejor rendimiento el planificador de Salesforce. Es por eso, que construí un planificador más agresivo y con más capacidades.

En esta entrada Planificador Dinámico de Procesos Asíncronos  y el código completo en este repositorio: Dynamic Planner. This repo is also available in English.

Data Skew Detector

No conozco qué Salesforce ofrezca, ninguna utilidad para la localización de Data Skew (anomalía en los datos que produce problemas graves de rendimiento), aunque anticiparnos a qué suceda en nuestra ORG, puede suponer ahorrarnos muchos dolores de cabeza.

Por ello, he desarrollado una utilidad en APEX que permite analizar tu ORG, y encontrar todos los campos con Data Skew. Disponibilizar esta información a tus compañeros, a tus usuarios, a tus administradores, o a tu cliente, puede suponer ahorrar problemas futuros, y ahorrar costes al proyecto.
Puedes encontrar una entrada explicativa en Data Skew Detector y el código en este repositorio: Data Skew Detector Repo.

Obtener información del consumo de Licencias en nuestras ORGs

Estar al corriente del uso de tus licencias, es fundamental para evitar sorpresas y costes inesperados. Desafortunadamente, no me parece práctico entrar regularmente en la ORG para evaluarlo.

Por eso investigué como automatizar mediante la API de Salesforce la obtención de esta información. Para obtener la información del uso de las licencias de las ORG se accede mediante el objeto UserLicense .

Puedes encontrar la entrada y Código en este repositorio: License Usage Multiple ORGs Salesforce.

Storage Notification Alert

Salesforce does not send notification when File or Data Storage hits the ORG limit, that’s not very convenient for an admin.

The Limits values are only exposed through REST API, no via standard object, to query it through SOQL No Packages found in App Exchange that are reliable and customizable, so I wrote mine, based on idea of bob_buzzard in https://developer.salesforce.com/forums/?id=906F000000092EjIAI (Screen Scraper, what is scaring and challenging at the same time).

Open repository available here: Storage Notification Alert Salesforce.

Estudio de Frameworks de Triggers

Los triggers, es una funcionalidad fantástica en Salesforce, pero a medida que avanza el proyecto y se afianza, su uso desordenado provoca situaciones inadvertidas o efectos laterales indeseados, con frustración por parte del desarrollador y del usuario.

Estuve estudiando, cuales son las problemáticas habituales, cuando aparecen, y las best practices y frameworks que se han desarrollado para mitigarlas. Desarrollé una serie de artículos, al respecto: Un Patrón Simple pero Potente: Análisis del patrón de Gestión de Triggers de Tony Scott,  El Framework de Appleman que los inició a todos: Análisis del Framework que publicó Dan Appleman en su libro Advanced Apex, y que es la referencia para muchos frameworks que aparecieron posteriormente, y finalmente El Framework de Hari Krishman, que evolucionó los conceptos de los 2 anteriores, y propuso una implementación mejorada de gran calidad.

El código utilizado en estos artículos está disponible en estos repositorios: Trigger Framework Dan Appleman, Trigger Framework Tony Scott, y en este el código empleado para el Meetup: Meetup Framework Trigger.

Evaluar el rendimiento de las consultas asociadas a un Dashboard

No existe la posibilidad para un administrador de obtener los costes y Query Plans generados por el Optimizer desde todos los Reports de un Dashboard en Salesforce.
Por tanto, escribí este código para obtener todos los Query Plans de los Reports que contiene cada Dashboard Component de un Dashboard de Salesforce. Para ello se invoca el recurso explain de la Tooling API.

Puedes encontrar la entrada en Optimización de Queries en Salesforce (Parte 2) – con Query Plan y Tooling/REST API y el código en este repositorio: Get Query Plans for a Salesforce Dashboard.

Evaluación de funcionalidades de la Plataforma

Change Data Capture

Protected Custom Metadata Type

Apex Connector Framework

Uso de la BULK API V2

Dado que he usado ampliamente esta API para cargar grandes volúmenes de datos, cuando apareció la versión 2, creé un cliente Java evaluar sus servicios y medir su rendimiento comparado con la versión inicial.

Big Objects

Big Objects es la implementación de Salesforce de contenedores de datos, para ingesta masiva, rendimiento garantizado de consulta e independientemente del volumen de registros (según la documentación oficial, sea 1 Millón o 1.000 Millones de registros).

Por tanto, como contenedores de datos de gran masivo, inicialmente podrían aplicarse a muchos casos de uso por la gran cantidad de datos que generan las compañías, pero sus limitaciones, restringen el abanico de casos de uso real.

Por ello, creé un proyecto, para probar su uso y rendimiento.

Uso del Flujo de Autenticación JWT Bearer Token con Salesforce

Este proyecto experimenta con el Flujo de Autenticación JWT de Salesforce. Después de buscar ejemplos y no encontrar un proyecto completo, me decidí a crear el mío propio.

Uso del Flujo de Autenticación Username/Password Salesforce

Este proyecto experimenta con el Flujo de Autenticación Username/Password de Salesforce.