    001/*
    002 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
    003 *
    004 * Project and contact information: http://www.cascading.org/
    005 *
    006 * This file is part of the Cascading project.
    007 *
    008 * Licensed under the Apache License, Version 2.0 (the "License");
    009 * you may not use this file except in compliance with the License.
    010 * You may obtain a copy of the License at
    011 *
    012 *     http://www.apache.org/licenses/LICENSE-2.0
    013 *
    014 * Unless required by applicable law or agreed to in writing, software
    015 * distributed under the License is distributed on an "AS IS" BASIS,
    016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017 * See the License for the specific language governing permissions and
    018 * limitations under the License.
    019 */
    020
    021package cascading.stats.tez;
    022
    023import java.util.Collection;
    024import java.util.Collections;
    025import java.util.HashMap;
    026import java.util.Map;
    027import javax.annotation.Nullable;
    028
    029import cascading.stats.CascadingStats;
    030import cascading.stats.FlowSliceStats;
    031import cascading.stats.ProvidesCounters;
    032
    033public class TezSliceStats extends FlowSliceStats<TezNodeStats.Kind> implements ProvidesCounters
    034  {
    035  private static final String LINE_SEPARATOR = System.getProperty( "line.separator" );
    036
    037  public static class TezAttempt extends FlowSliceAttempt
    038    {
    039    @Override
    040    public String getProcessAttemptID()
    041      {
    042      return null;
    043      }
    044
    045    @Override
    046    public int getEventId()
    047      {
    048      return 0;
    049      }
    050
    051    @Override
    052    public int getProcessDuration()
    053      {
    054      return 0;
    055      }
    056
    057    @Override
    058    public String getProcessStatus()
    059      {
    060      return null;
    061      }
    062
    063    @Override
    064    public String getStatusURL()
    065      {
    066      return null;
    067      }
    068
    069    @Override
    070    public CascadingStats.Status getStatus()
    071      {
    072      return null;
    073      }
    074
    075    @Override
    076    public String getProcessHostname()
    077      {
    078      return null;
    079      }
    080    }
    081
    082  private String id;
    083  private TezNodeStats.Kind kind;
    084  private final CascadingStats.Status parentStatus;
    085  private CascadingStats.Status status;
    086  private long submitTime;
    087  private long startTime;
    088  private long finishTime;
    089  private String successfulAttemptID;
    090  private String diagnostics;
    091
    092  private String vertexID;
    093  private String taskID;
    094  private long lastFetch = -1;
    095  private Map<String, Map<String, Long>> counters = Collections.emptyMap();
    096
    097  private Map<Integer, FlowSliceAttempt> attempts = new HashMap<>();
    098
    099  TezSliceStats( String id, TezNodeStats.Kind kind, CascadingStats.Status parentStatus, String vertexID, String taskID )
    100    {
    101    this.id = id;
    102    this.kind = kind;
    103    this.parentStatus = parentStatus;
    104    this.vertexID = vertexID;
    105    this.taskID = taskID;
    106    }
    107
    108  public void setSubmitTime( long submitTime )
    109    {
    110    this.submitTime = submitTime;
    111    }
    112
    113  public void setStartTime( long startTime )
    114    {
    115    this.startTime = startTime;
    116    }
    117
    118  public void setFinishTime( long finishTime )
    119    {
    120    this.finishTime = finishTime;
    121    }
    122
    123  public void setSuccessfulAttemptID( String successfulAttemptID )
    124    {
    125    this.successfulAttemptID = successfulAttemptID;
    126    }
    127
    128  @Override
    129  public String getID()
    130    {
    131    return id;
    132    }
    133
    134  @Override
    135  public long getProcessStartTime()
    136    {
    137    return submitTime; // start and submit are the same
    138    }
    139
    140  @Override
    141  public long getProcessRunTime()
    142    {
    143    return startTime; // when the slice began running
    144    }
    145
    146  @Override
    147  public long getProcessFinishTime()
    148    {
    149    return finishTime; // when the slice completed running
    150    }
    151
    152  public void setDiagnostics( String diagnostics )
    153    {
    154    this.diagnostics = diagnostics;
    155    }
    156
    157  public CascadingStats.Status getParentStatus()
    158    {
    159    return parentStatus;
    160    }
    161
    162  protected void setStatus( @Nullable CascadingStats.Status status )
    163    {
    164    if( status != null )
    165      this.status = status;
    166    }
    167
    168  @Override
    169  public CascadingStats.Status getStatus()
    170    {
    171    return status;
    172    }
    173
    174  @Override
    175  public TezNodeStats.Kind getKind()
    176    {
    177    return kind;
    178    }
    179
    180  public String[] getDiagnostics()
    181    {
    182    if( diagnostics == null )
    183      return new String[ 0 ];
    184
    185    return diagnostics.split( LINE_SEPARATOR ); // how tez packs the diags
    186    }
    187
    188  @Override
    189  public Map<String, Map<String, Long>> getCounters()
    190    {
    191    return counters;
    192    }
    193
    194  public String getProcessSliceID()
    195    {
    196    return taskID;
    197    }
    198
    199  @Override
    200  public String getProcessNodeID()
    201    {
    202    return vertexID;
    203    }
    204
    205  @Override
    206  public String getProcessStepID()
    207    {
    208    return null;
    209    }
    210
    211  @Override
    212  public String getProcessStatus()
    213    {
    214    return null;
    215    }
    216
    217  @Override
    218  public float getProcessProgress()
    219    {
    220    return 0;
    221    }
    222
    223  public Map<Integer, FlowSliceAttempt> getAttempts()
    224    {
    225    return attempts;
    226    }
    227
    228  public void setCounters( @Nullable Map<String, Map<String, Long>> counters )
    229    {
    230    if( counters != null )
    231      this.counters = counters;
    232    }
    233
    234  public void setLastFetch( long lastFetch )
    235    {
    236    this.lastFetch = lastFetch;
    237    }
    238
    239  @Override
    240  public long getLastSuccessfulCounterFetchTime()
    241    {
    242    return lastFetch;
    243    }
    244
    245  @Override
    246  public Collection<String> getCounterGroups()
    247    {
    248    return getCounters().keySet();
    249    }
    250
    251  @Override
    252  public Collection<String> getCountersFor( String group )
    253    {
    254    return getCounters().get( group ).keySet();
    255    }
    256
    257  @Override
    258  public Collection<String> getCountersFor( Class<? extends Enum> group )
    259    {
    260    return getCountersFor( group.getDeclaringClass().getName() );
    261    }
    262
    263  @Override
    264  public long getCounterValue( Enum counter )
    265    {
    266    return getCounterValue( counter.getDeclaringClass().getName(), counter.name() );
    267    }
    268
    269  @Override
    270  public long getCounterValue( String group, String name )
    271    {
    272    if( getCounters() == null || getCounters().get( group ) == null )
    273      return 0;
    274
    275    Long value = getCounters().get( group ).get( name );
    276
    277    if( value == null )
    278      return 0;
    279
    280    return value;
    281    }
    282
    283  public void addAttempt( Object event )
    284    {
    285//    attempts.put( event.getEventId(), new TezAttempt( event ) );
    286    }
    287
    288  @Override
    289  public String toString()
    290    {
    291    final StringBuilder sb = new StringBuilder();
    292    sb.append( "TezSliceStats" );
    293    sb.append( "{id='" ).append( id ).append( '\'' );
    294    sb.append( '}' );
    295    return sb.toString();
    296    }
    297  }