private static TimelineEntity maskFields(TimelineEntity entity, EnumSet<Field> fields) { // Conceal the fields that are not going to be exposed TimelineEntity entityToReturn = new TimelineEntity(); entityToReturn.setEntityId(entity.getEntityId()); entityToReturn.setEntityType(entity.getEntityType()); entityToReturn.setStartTime(entity.getStartTime()); // Deep copy if (fields.contains(Field.EVENTS)) { entityToReturn.addEvents(entity.getEvents()); } else if (fields.contains(Field.LAST_EVENT_ONLY)) { entityToReturn.addEvent(entity.getEvents().get(0)); } else { entityToReturn.setEvents(null); } if (fields.contains(Field.RELATED_ENTITIES)) { entityToReturn.addRelatedEntities(entity.getRelatedEntities()); } else { entityToReturn.setRelatedEntities(null); } if (fields.contains(Field.PRIMARY_FILTERS)) { entityToReturn.addPrimaryFilters(entity.getPrimaryFilters()); } else { entityToReturn.setPrimaryFilters(null); } if (fields.contains(Field.OTHER_INFO)) { entityToReturn.addOtherInfo(entity.getOtherInfo()); } else { entityToReturn.setOtherInfo(null); } return entityToReturn; }
private static void publishApplicationAttemptEvent( TimelineClient timelineClient, String appAttemptId, DSEvent appEvent) throws IOException, YarnException { TimelineEntity entity = new TimelineEntity(); entity.setEntityId(appAttemptId); entity.setEntityType(DSEntity.DS_APP_ATTEMPT.toString()); entity.addPrimaryFilter("user", UserGroupInformation.getCurrentUser().toString()); TimelineEvent event = new TimelineEvent(); event.setEventType(appEvent.toString()); event.setTimestamp(System.currentTimeMillis()); entity.addEvent(event); timelineClient.putEntities(entity); }
private static void publishContainerEndEvent( TimelineClient timelineClient, ContainerStatus container) throws IOException, YarnException { TimelineEntity entity = new TimelineEntity(); entity.setEntityId(container.getContainerId().toString()); entity.setEntityType(DSEntity.DS_CONTAINER.toString()); entity.addPrimaryFilter("user", UserGroupInformation.getCurrentUser().toString()); TimelineEvent event = new TimelineEvent(); event.setTimestamp(System.currentTimeMillis()); event.setEventType(DSEvent.DS_CONTAINER_END.toString()); event.addEventInfo("State", container.getState().name()); event.addEventInfo("Exit Status", container.getExitStatus()); entity.addEvent(event); timelineClient.putEntities(entity); }
private static void publishContainerStartEvent(TimelineClient timelineClient, Container container) throws IOException, YarnException { TimelineEntity entity = new TimelineEntity(); entity.setEntityId(container.getId().toString()); entity.setEntityType(DSEntity.DS_CONTAINER.toString()); entity.addPrimaryFilter("user", UserGroupInformation.getCurrentUser().toString()); TimelineEvent event = new TimelineEvent(); event.setTimestamp(System.currentTimeMillis()); event.setEventType(DSEvent.DS_CONTAINER_START.toString()); event.addEventInfo("Node", container.getNodeId().toString()); event.addEventInfo("Resources", container.getResource().toString()); entity.addEvent(event); timelineClient.putEntities(entity); }
@Test public void testEntities() throws Exception { TimelineEntities entities = new TimelineEntities(); for (int j = 0; j < 2; ++j) { TimelineEntity entity = new TimelineEntity(); entity.setEntityId("entity id " + j); entity.setEntityType("entity type " + j); entity.setStartTime(System.currentTimeMillis()); for (int i = 0; i < 2; ++i) { TimelineEvent event = new TimelineEvent(); event.setTimestamp(System.currentTimeMillis()); event.setEventType("event type " + i); event.addEventInfo("key1", "val1"); event.addEventInfo("key2", "val2"); entity.addEvent(event); } entity.addRelatedEntity("test ref type 1", "test ref id 1"); entity.addRelatedEntity("test ref type 2", "test ref id 2"); entity.addPrimaryFilter("pkey1", "pval1"); entity.addPrimaryFilter("pkey2", "pval2"); entity.addOtherInfo("okey1", "oval1"); entity.addOtherInfo("okey2", "oval2"); entities.addEntity(entity); } LOG.info("Entities in JSON:"); LOG.info(TimelineUtils.dumpTimelineRecordtoJSON(entities, true)); Assert.assertEquals(2, entities.getEntities().size()); TimelineEntity entity1 = entities.getEntities().get(0); Assert.assertEquals("entity id 0", entity1.getEntityId()); Assert.assertEquals("entity type 0", entity1.getEntityType()); Assert.assertEquals(2, entity1.getRelatedEntities().size()); Assert.assertEquals(2, entity1.getEvents().size()); Assert.assertEquals(2, entity1.getPrimaryFilters().size()); Assert.assertEquals(2, entity1.getOtherInfo().size()); TimelineEntity entity2 = entities.getEntities().get(1); Assert.assertEquals("entity id 1", entity2.getEntityId()); Assert.assertEquals("entity type 1", entity2.getEntityType()); Assert.assertEquals(2, entity2.getRelatedEntities().size()); Assert.assertEquals(2, entity2.getEvents().size()); Assert.assertEquals(2, entity2.getPrimaryFilters().size()); Assert.assertEquals(2, entity2.getOtherInfo().size()); }
TimelineEntity createPostHookEvent( String queryId, long stopTime, String user, String requestuser, boolean success, String opId, PerfLogger perfLogger) throws Exception { LOG.info("Received post-hook notification for :" + queryId); TimelineEntity atsEntity = new TimelineEntity(); atsEntity.setEntityId(queryId); atsEntity.setEntityType(EntityTypes.HIVE_QUERY_ID.name()); atsEntity.addPrimaryFilter(PrimaryFilterTypes.user.name(), user); atsEntity.addPrimaryFilter(PrimaryFilterTypes.requestuser.name(), requestuser); if (opId != null) { atsEntity.addPrimaryFilter(PrimaryFilterTypes.operationid.name(), opId); } TimelineEvent stopEvt = new TimelineEvent(); stopEvt.setEventType(EventTypes.QUERY_COMPLETED.name()); stopEvt.setTimestamp(stopTime); atsEntity.addEvent(stopEvt); atsEntity.addOtherInfo(OtherInfoTypes.STATUS.name(), success); // Perf times JSONObject perfObj = new JSONObject(new LinkedHashMap<>()); for (String key : perfLogger.getEndTimes().keySet()) { perfObj.put(key, perfLogger.getDuration(key)); } atsEntity.addOtherInfo(OtherInfoTypes.PERF.name(), perfObj.toString()); return atsEntity; }
TimelineEntity createPreHookEvent( String queryId, String query, JSONObject explainPlan, long startTime, String user, String requestuser, int numMrJobs, int numTezJobs, String opId, String clientIpAddress, String hiveInstanceAddress, String hiveInstanceType, String sessionID, String logID, String threadId, String executionMode, List<String> tablesRead, List<String> tablesWritten, HiveConf conf) throws Exception { JSONObject queryObj = new JSONObject(new LinkedHashMap<>()); queryObj.put("queryText", query); queryObj.put("queryPlan", explainPlan); LOG.info("Received pre-hook notification for :" + queryId); if (LOG.isDebugEnabled()) { LOG.debug("Otherinfo: " + queryObj.toString()); LOG.debug("Operation id: <" + opId + ">"); } conf.stripHiddenConfigurations(conf); Map<String, String> confMap = new HashMap<String, String>(); for (Map.Entry<String, String> setting : conf) { confMap.put(setting.getKey(), setting.getValue()); } JSONObject confObj = new JSONObject((Map) confMap); TimelineEntity atsEntity = new TimelineEntity(); atsEntity.setEntityId(queryId); atsEntity.setEntityType(EntityTypes.HIVE_QUERY_ID.name()); atsEntity.addPrimaryFilter(PrimaryFilterTypes.user.name(), user); atsEntity.addPrimaryFilter(PrimaryFilterTypes.requestuser.name(), requestuser); atsEntity.addPrimaryFilter(PrimaryFilterTypes.executionmode.name(), executionMode); atsEntity.addPrimaryFilter( PrimaryFilterTypes.queue.name(), conf.get("mapreduce.job.queuename")); if (opId != null) { atsEntity.addPrimaryFilter(PrimaryFilterTypes.operationid.name(), opId); } for (String tabName : tablesRead) { atsEntity.addPrimaryFilter(PrimaryFilterTypes.tablesread.name(), tabName); } for (String tabName : tablesWritten) { atsEntity.addPrimaryFilter(PrimaryFilterTypes.tableswritten.name(), tabName); } TimelineEvent startEvt = new TimelineEvent(); startEvt.setEventType(EventTypes.QUERY_SUBMITTED.name()); startEvt.setTimestamp(startTime); atsEntity.addEvent(startEvt); atsEntity.addOtherInfo(OtherInfoTypes.QUERY.name(), queryObj.toString()); atsEntity.addOtherInfo(OtherInfoTypes.TEZ.name(), numTezJobs > 0); atsEntity.addOtherInfo(OtherInfoTypes.MAPRED.name(), numMrJobs > 0); atsEntity.addOtherInfo(OtherInfoTypes.SESSION_ID.name(), sessionID); atsEntity.addOtherInfo(OtherInfoTypes.INVOKER_INFO.name(), logID); atsEntity.addOtherInfo(OtherInfoTypes.THREAD_NAME.name(), threadId); atsEntity.addOtherInfo(OtherInfoTypes.VERSION.name(), VERSION); if (clientIpAddress != null) { atsEntity.addOtherInfo(OtherInfoTypes.CLIENT_IP_ADDRESS.name(), clientIpAddress); } atsEntity.addOtherInfo(OtherInfoTypes.HIVE_ADDRESS.name(), hiveInstanceAddress); atsEntity.addOtherInfo(OtherInfoTypes.HIVE_INSTANCE_TYPE.name(), hiveInstanceType); atsEntity.addOtherInfo(OtherInfoTypes.CONF.name(), confObj.toString()); return atsEntity; }