Filling Informatica's Gaps: Building Metadata Collection Interfaces When the Vendor's UI Isn't Enough

After the EDC assessment, the client had a specific problem: the catalog knew about their data assets, but metadata quality was low. Scanner-discovered attributes were incomplete. Business context was missing entirely — no descriptions, no data owners, no sensitivity classifications. The gap wasn't in the tool's capabilities; it was in how metadata got collected in the first place.

Informatica provides UI forms for manual metadata entry, but those forms require navigating the EDC interface, which data owners — finance analysts, HR specialists, product managers — were not going to do. We needed metadata collection to happen where those people already worked, not in a tool they'd never seen.

The Interface Strategy

The approach: build lightweight web forms that collected specific metadata about specific assets, and wrote the results back to EDC via API. Data owners got a URL, filled in a form with five to ten fields, submitted. The catalog got populated without anyone needing to know what EDC was.

from flask import Flask, request, jsonify
import requests
import json

app = Flask(__name__)

EDC_BASE_URL = "https://edc.internal.company.com"
EDC_TOKEN = "..." # from env / secrets manager

def update_edc_attribute(asset_id: str, attribute_name: str, value: str) -> None:
headers = {
'Authorization': f'Bearer {EDC_TOKEN}',
'Content-Type': 'application/json'
}
payload = {
'id': asset_id,
'facets': [{
'name': 'com.infa.ldm.relational.Column',
'attributes': [{
'name': attribute_name,
'value': value
}]
}]
}
resp = requests.patch(
f"{EDC_BASE_URL}/access/2/catalog/data/objects",
headers=headers,
json=payload
)
resp.raise_for_status()

@app.route('/metadata/submit', methods=['POST'])
def submit_metadata():
data = request.json
asset_id = data['asset_id']
try:
if data.get('description'):
update_edc_attribute(asset_id, 'com.infa.ldm.relational.description', data['description'])
if data.get('data_owner'):
update_edc_attribute(asset_id, 'com.infa.ldm.relational.dataOwner', data['data_owner'])
if data.get('sensitivity'):
update_edc_attribute(asset_id, 'com.infa.ldm.relational.dataSensitivity', data['sensitivity'])
return jsonify({'status': 'success', 'asset_id': asset_id})
except requests.HTTPError as e:
return jsonify({'status': 'error', 'message': str(e)}), 500

The Completeness Tracker

The forms alone weren't enough — we needed visibility into what was still missing. A weekly report pulled all assets from EDC and flagged any with empty required attributes:

def get_incomplete_assets(required_attributes: list[str]) -> list[dict]:
    resp = requests.get(
        f"{EDC_BASE_URL}/access/2/catalog/data/objects",
        headers={'Authorization': f'Bearer {EDC_TOKEN}'},
        params={'objectClass': 'com.infa.ldm.relational.Column', 'pageSize': 500}
    )
    resp.raise_for_status()
    assets = resp.json().get('items', [])
    incomplete = []
    for asset in assets:
        attr_names = {
            a['name'] for facet in asset.get('facets', [])
            for a in facet.get('attributes', [])
        }
        missing = [a for a in required_attributes if a not in attr_names]
        if missing:
            incomplete.append({
                'id': asset['id'],
                'name': asset.get('name', ''),
                'missing_attributes': missing
            })
    return incomplete

Patching Informatica's Weak Points

The Axon-EDC term linkage was a similar problem. Informatica's UI supported it, but bulk import from an existing glossary spreadsheet required the API. The API documentation had gaps — endpoint signatures documented but request/response payloads not shown. Two days of trial and error with the Informatica support team produced working import code.

That's the honest reality of working with enterprise catalog tools: the core scanner and lineage capabilities are solid, but the edge cases and integration surfaces are rough. Building the glue layer between the catalog and how your organization actually works is real work that the vendor won't do for you. As always, I'm here to help.

Read more